【问题标题】:tableview reloaddata in masterview from detail view从详细视图中的主视图中的表视图重新加载数据
【发布时间】:2012-07-03 12:53:15
【问题描述】:

我有一个主从应用程序,它在masterViewControllerdetailview 中有一个表格视图,您可以在文本字段中编辑和添加信息等等。我在详细视图中有一个保存按钮作为rightBarButtonItem。如果他们没有保存他们的工作并且他们回击我有一个UIAlertView 弹出询问他们是否要保存他们的工作。在 alertview 后面,detailview 仍然被关闭,masterviewcontroller 现在正在显示。

所以当我点击保存时,tableview 不会更新。我的 masterviewcontroller viewWillAppear 中有 [tableview reloadData] 但它不起作用,因为在用户可以点击保存之前视图出现在警报视图后面。我想在这个方法中调用[tableview reloadData](或类似的东西),这是从我的详细视图中调用的。

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex

我不能只调用[tableview reloadData],因为alertViews 委托被设置为detailview,因为如果他们在alertview 上推送保存,它会从文本字段中提取所有信息以保存到plist 中。有没有办法可以从我的 alertView 调用 [tableView reloadData]

【问题讨论】:

  • 两种情况下都保存失败吗?即来自rightBarButtonItem 和来自alertView?另外,你为什么要在 alertView 被解散之前解散 detailView
  • 不保存对 rightBarButtonItem 有效。由于我使用的是主从应用程序模板,因此 detailView 被自动关闭。我知道我在下面写了我的解决方案。谢谢你的时间。除非您知道有一种方法可以延迟 detailView 在主从应用程序模板中被解除。 -干杯

标签: objective-c ios cocoa-touch uitableview ios4


【解决方案1】:

设置tableview的属性并尝试

[self.tableView reloadData]

【讨论】:

  • 我不能做 self.tableView 因为 alertViews Delegate 是 DetailView 所以当我调用 self 它认为我在调用 detailView 而不是 masterView(tableView 所在的位置)
【解决方案2】:

我猜你必须为此创建一个委托方法。

  • 创建协议,
  • 在内部创建一种方法,例如- (void) updateMyMasterTable;
  • 在您的详细信息类中创建一个类似 id <ProtocolName> obj; 的委托实例并写入 .h 文件。
  • 合成它。
  • 当你想重新加载你的主表视图时调用[obj updateMyMasterTable];
  • 在您的主类 .m 文件中实现 - (void) updateMyMasterTable 方法并调用 [tableView reloadData];

【讨论】:

    【解决方案3】:

    如果我正确理解您的问题,您将在点击alertView 上的任何按钮之前关闭detailView。我不知道您将数据保存在哪里以及 tableView 从哪里检索数据,但请尝试在 alertView 上等待用户交互。

    在您弹出alertView 要求保存的代码中,什么也不做。

    - (void)yourBackButtonAction //i assumed this is your method when they hit 'back'
    {
        UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:title message:@"Would you like to save your work?" delegate:self cancelButtonTitle:@"No"  otherButtonTitles:@"Yes", nil];
    
        [alertView show];
        [alertView release];
    }
    

    在委托方法中,保存数据并关闭detailView

    - (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
    {
         if (buttonIndex == 1) //yes
        {
            //save your data
            [self.navigationController dismissModalViewControllerAnimated:YES];
        }
        else // no
            [self.navigationController dismissModalViewControllerAnimated:YES];
    }
    

    现在在您的 masterViewController's viewWillAppear 方法中,[self.tableView reloadData] 应该可以工作了。

    【讨论】:

      【解决方案4】:

      我想通了。我所做的是在我的 DetailViewController.h 文件中创建了 UITableViewController 的属性并将其命名为 masterView 然后在其 .m 文件中合成它。然后我进入我的 masterViewController.m 文件并找到方法 tableView:didSelectRowAtIndexPath: 并将我的 detailsViewController.masterView 属性设置为 self(self 是 masterViewController)。

      - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
      {
            self.detailViewController.masterView = self;
      }
      

      然后我进入我的 UIAlertView 保存方法并在 masterViews tableView 上调用 reloadData

      - (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
      {
          if (buttonIndex == 1) {
              [masterView.tableView reloadData];
          }
      }
      

      这非常类似于从tableView indexPath.row 将信息传递到详细视图中的数组或字典,如下所示(这也在方法tableView:didSelectRowAtIndexPath: 中)

      self.detailViewController.detailItem = object;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-22
        • 1970-01-01
        • 2016-10-16
        • 2014-01-07
        • 1970-01-01
        相关资源
        最近更新 更多