0

我已经尝试实施这个协议几个小时了,但由于某种原因它似乎不起作用。基本上我有一个拆分视图,它有一个视图控制器和一个表控制器,一个类将这两者结合在一起。主类创建表的一个实例并完美运行,但如果我选择一个单元格,我希望视图控制器做出反应。因此,我想创建一个协议,以便在选择表单元时会在主类中执行某些操作。

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 方法。:( 将不胜感激提供的任何帮助 :)

4

1 回答 1

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.
}

此外,委托属性通常应该是(弱)而不是(保留)。

于 2013-01-31T17:49:34.847 回答