iPhone - how to use performSelector with complex parameters?
cocoa, ipad, iphone, iphone-sdk-3.0
Solution
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);
Problem
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...