【问题标题】:Unable to update table in superview from subview无法从子视图更新超级视图中的表
【发布时间】:2012-06-18 17:26:27
【问题描述】:

我使用的是 Xcode 4.3,虽然我已经做了很多年的程序员,但我在 Xcode 中有点像个笨蛋。

我有一个名为 First 的 UIView,它包含一个从内存中的文件获取其内容的 UITable。然后,我创建了一个名为 Second 的子视图 UIView,它对数据文件进行了更改,这些更改应该会更改 First 中表的内容。当我删除 Second 并返回 First 时,这并不奇怪,表没有更新。下次从头开始加载 First 时,该表会反映所做的更改。

First 包含方法 viewDidLoad,该方法用于从文件中的数据中加载 NSArray 以及表所需的数据。我可以从 Second 调用 viewDidLoad,但除非表是从新更改的 NSArray 更新的,否则表将显示为与更改之前一样。

所以我的问题是如何从 Second 调用表方法,以便在删除 Second 并返回 First 时更新 First 中的表。我曾尝试调用将数据加载到表中的表方法,但由于出现编译错误,因此没有成功。我需要知道如何调用 table 函数,以在我返回 first 时更新表格。

至少我的部分问题是我不知道如何调用表更新,因为它没有像我预期的那样从 viewDidLoad 调用。

抱歉,这是对问题的冗长描述。我正在编写的程序的其余大部分都在工作,我已经处理这个问题几个月了。我每隔几周就会回来一次,然后再试一次,但到目前为止还没有运气。我真的很感谢您提供的任何帮助,这将提高我的理解并解决问题。

这里是修复后的代码:第一(superview)相关代码

 -(void)viewDidLoad {  
    NSFileManager * fm = [[NSFileManager alloc] init];  
    NSError* err = nil;  
    NSPredicate *fltr = [NSPredicate predicateWithFormat:@"self ENDSWITH '.dir'"];  
    NSArray *array = [fm contentsOfDirectoryAtPath: userFolder error:&err];  
    self.listData = [array filteredArrayUsingPredicate:fltr];  
    [self.tableView reloadData]; //This does the updating must make table an IBOutlet as  
    [super viewDidLoad];         //described in one of the comments by m. Othman  
}    

这是修复后的代码:第二个(子视图)相关代码。此代码位于 在更改应该影响表格显示的方法中

UIView * start = [self.view superview]; //this line and next two call viewDidLoad in first  
UIResponder * nextResponder = [start nextResponder];  
[nextResponder viewDidLoad];  

【问题讨论】:

    标签: xcode4 subviews uitableview


    【解决方案1】:

    你读过UIViewController API reference吗?除了 -viewDidLoad 之外,还有更多选项可用于处理视图的(重新)外观...

    【讨论】:

    • Joshua - 我尝试过 viewWillAppear、viewDidAppear、viewDidLoad 和 loadView。您还有其他建议吗?在我看来,与其调用不同的方法,我需要包含一个方法来重绘表格。你怎么看?沃尔多
    • 您的措辞让我担心您是在尝试直接调用这些方法,而不是在视图控制器类中实现它们以便系统在适当的时间调用。
    • 我已经尝试过从子视图调用一个函数,只是删除子视图并让超级视图中的函数处理它。但是,我并没有使用所有不同的功能两种方式都做到这一点。我会试一试。谢谢。
    • Joshua - 如果我理解你的建议 - 只更新 NSArray 的超级视图中的代码名为“viewDidLoad”。我将该名称更改为其他三个内置方法:viewWillAppear、viewDidAppear 和 loadView。其他三个甚至都不能正确地显示表格。如果我不明白你的建议,请解释。我的问题是我不明白表是如何更新的,因为该方法不是从 viewDidLoad 方法的主体中调用的。再次感谢您的任何建议。我会继续问希望你没事。
    • 这里是第一个相关的代码-(注意最后一行的代码重新加载表数据) (void)viewDidLoad { NSFileManager * fm = [[NSFileManager alloc] init]; NSError* 错误 = nil; NSPredicate *fltr = [NSPredicate predicateWithFormat:@"self ENDSWITH '.dir'"]; NSArray *array = [fm contentsOfDirectoryAtPath: userFolder error:&err]; fm = 无; self.listData = [数组过滤数组UsingPredicate:fltr]; [self.tableView reloadData]; [超级视图DidLoad];这是从第二个是子视图的相关代码
    【解决方案2】:

    好吧,UITableView 代表只是在加载视图或要求它重新加载时调用..
    所以在你的 viewDidLoad 或任何应该改变 tableview 内容的方法中,你需要写这一行

    [tableview reloadData];
    

    希望我能理解你的问题!!

    【讨论】:

    • M.奥斯曼,这正是我想要的,对我来说很有意义。但是,当我输入那行代码时,它说它不知道标识符 tableview。我的 tableview 拼写为 tableView 但这没有区别。所以显然我需要在 .h 文件中声明 tableView 但是它后面有一个很长的参数列表,不清楚应该在声明中包含什么。对不起,这应该是我知道该怎么做的事情,但不要。希望你能帮助我。
    • 你只需要像 IBOutlet UITableView *tableview 一样为tableview声明一个出口;并将其链接到界面构建器中的表格视图...
    • M.奥斯曼——超级,它奏效了。顺便说一句,这是我在网上问的第一个问题。过去,当我有一个问题时,我只是通过尝试一些事情并在谷歌上搜索我遇到的问题来顽固地挂在那里。如果您在附近,我会请您喝一杯或其他什么(我在科罗拉多州格里利 - 如果您在附近,请找我)。沃尔多
    • 很高兴它与您合作,问这个问题并不可耻,我以前也遇到过这个问题,其他人也遇到过并且会...谢谢你的提议,我肯定会的:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多