代码之家  ›  专栏  ›  技术社区  ›  MidnightLightning

iPhone UITableView是否触发父方法?

  •  0
  • MidnightLightning  · 技术社区  · 14 年前

    好的,我正在开发一个iPhone应用程序,它有一个Preferences-Queue部分,其中有一个基本的TableView,它有一个部分,以及几行定制的单元格,用于保存名称和值标签。单击一行会出现另一个视图,允许用户从列表(另一个表视图)中进行选择,并选择一个项目。

    所有这些表视图都是通过编程完成的。基表视图有一个属性,它为每个“从列表中选择”视图保存一个控制器实例。每个“从列表中选择”视图都有一个名为 chosenValue 具有当前选定的选项。我已经让用户界面处理 didSelectRowAtIndexPath 更新 价值观 属性,然后“ pop “视图(返回主表视图)。但是,即使主表视图 cellForRowAtIndexPath 方法引用 价值观 属性中包含的子视图的属性,选择项时该视图不会更新。简而言之,子视图如何触发 reloadData 在父对象上,在它“弹出”并卸载之后?

    3 回复  |  直到 14 年前
        1
  •  2
  •   flohei    14 年前

    例如,您可以使用通知或委托来实现这一点。

    使用通知,您的第一个视图控制器必须注册如下通知:

    …
    
    [[NSNotificationCenter defaultCenter] addObserver:self  
                                             selector:@selector(methodToBeCalled:)  
                                                 name:@"myNotification"  
                                               object:nil]; 
    
    …
    
    - (void)methodToBeCalled:(NSNotification *)notification { 
        [self.tableView reloadData];
        // do something else
    }
    

    然后您可以在第二个视图控制器中发出如下通知:

    [[NSNotificationCenter defaultCenter] postNotificationName:@"myNotification" object:nil];
    

    使用委托可以在第二个视图上实现委托的属性,将其设置为 self 在推送第二个视图控制器并在需要时对委托调用方法之前。

        2
  •  1
  •   sha    14 年前

    您应该为此定义一个委托。 在子表视图中定义协议:

    @protocol ChildViewControllerDelegate
    - (void) somethingUpdated;
    @end
    

    还为实现此协议的委托定义属性:

    id <ChildViewControllerDelegate> delegate;
    

    然后,在父视图中,您需要做的就是定义一个更新的方法,将自己(父)分配给子视图中的委托属性,并在需要更新该方法时在子视图中调用该方法。根据您试图完成的任务,在父级中更新的某个内容的实现可能会有所不同。

        3
  •  0
  •   Threebrain    14 年前

    Flohei非常感谢你发这个帖子!!我在使用nsnotificationcenter!我现在有一个子视图调用父视图中的方法!令人惊叹的。@我也试过你的方案,但没能搞清楚。也许更详细的描述能帮助像我这样的笨蛋。我一直在读你的协议方式更好,因为我猜代码更少?所以我会继续学习。谢谢你们俩!