我一直试图将这个协议实施几个小时,但由于某种原因它似乎没有用。基本上我有一个拆分视图,它有一个视图控制器和一个表控制器,一个类将这两个放在一起。主类创建表的实例并完美运行,但如果我选择一个单元格,我希望视图控制器做出反应。所以我想创建一个协议,当选择表格单元格时,它将在主类中执行某些操作。
TableSplitViewController,这是主类:
@interface TableSplitViewController : UIViewController <updateView>
{
ChildrenTableViewController *firstController;
IBOutlet UITableView *firstTable;
IBOutlet UITableViewCell *tablecell;
NSString *name;
}
@property (nonatomic, strong) NSString *name;
@property (nonatomic, strong) IBOutlet UILabel *childnamelabel;
@end
这是TableSplitViewController.m:
- (void)viewDidLoad
{
[super viewDidLoad];
if (firstController == nil) {
firstController = [[ChildrenTableViewController alloc] initWithStyle:UITableViewStyleGrouped];
}
[firstTable setDataSource:firstController];
[firstTable setDelegate:firstController];
firstController.view = firstController.tableView;
// Do any additional setup after loading the view.
}
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([[segue identifier] isEqualToString:@"ShowChildrenDetails"]) {
ChildrenDetailViewController *detailViewController = [segue destinationViewController];
NSIndexPath *myIndexPath = [firstController.tableView indexPathForSelectedRow];
detailViewController.childrenDetailModel = [[NSArray alloc]
initWithObjects: [firstController.childname objectAtIndex:[firstController.index row]], nil];
}
}
- (void) setNameLabel:(NSString *)sender
{
// self.name = sender;
NSLog(@"ran");
}
这是ChildrenTableViewController.h:
@protocol updateView <NSObject>
@required
- (void) setNameLabel:(NSString *)sender;
@end
@interface ChildrenTableViewController : UITableViewController
{
NSIndexPath *index;
id <updateView> delegate1;
}
@property (nonatomic, strong) NSMutableArray *childname;
@property (nonatomic, strong) NSIndexPath *index;
@property (retain) id delegate1;
@end
这是ChildrenTableViewController.m的关键部分:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
[[self delegate1] setNameLabel:[self.childname objectAtIndex:[indexPath row]]];
NSLog(@"rannn");
正如您在上一个代码中看到的那样,我试图使用协议函数调用该方法。它似乎没有工作由于某种原因,我已经放入NSLOG,它甚至根本不运行setNameLabel方法。 :(将感谢任何提供的帮助:)
答案 0 :(得分:2)
在上面的代码中,我看不到你如此设置委托:
- (void)viewDidLoad
{
[super viewDidLoad];
if (firstController == nil) {
firstController = [[ChildrenTableViewController alloc] initWithStyle:UITableViewStyleGrouped];
}
[firstTable setDataSource:firstController];
[firstTable setDelegate:firstController];
firstController.view = firstController.tableView;
// Set up the delegate for the controller
[firstController setDelegate1:self];
// Do any additional setup after loading the view.
}
此外,委托属性通常应该是(弱)而不是(保留)。