2014-10-29 51 views
0

我正在为iPad应用程序使用分割视图控制器。我试图在按下按钮时从rootSending Controll向detailReceiving Controller发送标签更改。我已阅读了有关协议的教程,并提供了下面的代码。当我点击rootSending上的按钮时,detailReceiving上的标签没有任何反应。我是否必须使用splitViewContoller做其他事情,以便标签更新?接收消息时,不应该细节接收更改标签吗?使用委托来传递字符串的UISplitViewController

rootSending.h

#import <UIKit/UIKit.h> 
@protocol TestDelegate <NSObject> 
-(void)tester:(NSString*)testString; 
@end 

@interface rootSending : UIViewController 
@property (nonatomic, assign) id <TestDelegate> delegate; 
@end 

rootSending.m

#import "rootSending.h" 

@implementation rootSending 
@synthesize delegate; 
-(void)viewDidLoad{ 

} 
-(IBAction)buttonPressed:(id)sender{ 

[delegate tester:@"button pressed"]; 
} 

@end 

detailReceiving.m

#import "detailReceiving.h" 
#import "rootSending.h" 
@interface detailReceiving()<TestDelegate>{ 
IBOutlet UILabel *label2; 
} 
@end 
@implementation detailReceiving 
-(void)viewDidLoad{ 
rootSending *obj = [rootSending alloc]; 
obj.delegate = self ; 
} 
-(void)tester:(NSString *)testString{ 
label2.text = testString; 
} 

@end 

回答

0

首先,永远不会有一个页头没有初始化!但是在这种情况下,即使你使用了alloc/init,它仍然不起作用,因为它只是创建一个新的rootSending实例,而不是你在分割视图中创建的实例。你需要去一个你有,你可以从拆分视图控制器获得参考,

-(void)viewDidLoad{ 
rootSending *obj = (rootSending *)self.splitViewController.viewControllers.firstObject; 
obj.delegate = self; 
} 

编辑后:

如果你的伴侣控制器嵌入导航控制器,那么你需要让导航控制器的topViewController获取您的参考。

-(void)viewDidLoad{ 
    UINavigationController *nav = (UINavigationController *)self.splitViewController.viewControllers.firstObject; 
    xmlListOfItems *obj = (xmlListOfItems *)nav.topViewController; 
    obj.delegate = self; 
    } 
+0

伟大的工程!好的提示在alloc上。我只知道我不想启动它。 – iDev 2014-10-29 17:32:57

+0

如果故事板是分屏视图 - >导航控制器 - >视图,该怎么办?这不起作用:xmlListofItems * obj =(xmlListofItems *)self.splitViewController.navigationController.viewControllers.firstObject; – iDev 2014-10-29 18:02:56

+0

@iDEV,你真的需要考虑你的控制器结构,以及你的控制器如何相互关联 - 这是你必须学习的非常重要的iOS编程基础知识。我已经更新了我的答案,告诉你如何做到这一点,但你需要做一些学习来学习这些东西。 – rdelmar 2014-10-29 18:42:04