I have an application designed for iPhone OS 2.x.
At some point I have this code
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
//... previous stuff initializing the cell and the identifier
cell = [[[UITableViewCell alloc]
initWithFrame:CGRectZero
reuseIdentifier:myIdentifier] autorelease]; // A
// ... more stuff
}
But as the initWithFrame selector was deprecated in 3.0, I need to transform this code using respondToSelector and performSelector... as this...
if ( [cell respondsToSelector:@selector(initWithFrame:)] ) { // iphone 2.0
// [cell performSelector:@selector(initWithFrame:) ... ???? what?
}
My problem is: how can I break the call on A into preformSelector calls if I have to pass two parameters "initWithFrame:CGRectZero" and "reuseIdentifier:myIdentifier" ???
EDIT - As sugested by fbrereto, I did this
[cell performSelector:@selector(initWithFrame:reuseIdentifier:)
withObject:CGRectZero
withObject:myIdentifier];
The error I have is "incompatible type for argument 2 of 'performSelector:withObject:withObject'.
myIdentifier is declared like this
static NSString *myIdentifier = @"Normal";
I have tried to change the call to
[cell performSelector:@selector(initWithFrame:reuseIdentifier:)
withObject:CGRectZero
withObject:[NSString stringWithString:myIdentifier]];
without success...
The other point is CGRectZero not being an object...
Use NSInvocation
.
NSInvocation* invoc = [NSInvocation invocationWithMethodSignature:
[cell methodSignatureForSelector:
@selector(initWithFrame:reuseIdentifier:)]];
[invoc setTarget:cell];
[invoc setSelector:@selector(initWithFrame:reuseIdentifier:)];
CGRect arg2 = CGRectZero;
[invoc setArgument:&arg2 atIndex:2];
[invoc setArgument:&myIdentifier atIndex:3];
[invoc invoke];
Alternatively, call objc_msgSend
directly (skipping all the unnecessary complex high-level constructs):
cell = objc_msgSend(cell, @selector(initWithFrame:reuseIdentifier:),
CGRectZero, myIdentifier);
The selector you are looking to use is actually @selector(initWithFrame:reuseIdentifier:)
. To pass two parameters use performSelector:withObject:withObject:
. It may take a little trial and error to get the parameters just right, but it should work. If it does not I would recommend exploring the NSInvocation
class which is intended to handle more complicated message dispatching.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With