我有一个UIViewController(1),我按下该控制器中的一个视图然后按下另一个带有全屏UITableView的UIViewController(2)。
然后我按下UITableView中的一个单元格,并希望在UITableView中向UIViewController(1)传递一个字符串。我尝试使用下面的delegete方法,但它不起作用,请有人建议。
UIViewController2.h
@protocol SecondDelegate <NSObject>
-(void) secondViewControllerDismissed:(NSString *)stringForFirst;
@end
@interface ViewController2 : UIViewController
{
id myDelegate;
}
@property (nonatomic, assign) id<SecondDelegate> myDelegate;
@end
和
UIViewController2.m (inside didSelectRowAtIndexPath)
[self.myDelegate secondViewControllerDismissed:@"the string I'm passing"];
和
UIViewController1.h
import "ViewController2.h"
@interface ViewController1 : UIViewController <SecondDelegate>
@end
和
UIViewController1.m
- (void)secondViewControllerDismissed:(NSString *)stringForFirst
{
NSString *myString = stringForFirst;
self.myLabel.text = myString;
}
答案 0 :(得分:1)
一些事情:
id myDelegate;
@interface ViewController2
@property (nonatomic, assign) id...
更改为@property (nonatomic, weak) id...
,这样更安全(参见why)关于你的问题:你通过segue呈现视图!?因此,您需要覆盖prepareForSegue
方法,从destinationViewController
中提取segue
并将其delegate
属性设置为self
。没有它,您的ViewController2永远不会获得有效的委托集。所有这些都需要在viewController 呈现 ViewController2
:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
[super prepareForSegue:segue sender:sender];
if ([segue.identifier isEqualToString:@"yourCustomSegueIdentifier"]) {
ViewController2 *controller = (ViewController2*)segue.destinationViewController;
controller. myDelegate = self;
}
}
在故事板中设置segue的标识符,并在上面的ode中使用相同的标识符,或者删除if all all(unclean)。