【问题标题】:How to delegate back to the previous veiwcontroller如何委托回前一个视图控制器
【发布时间】:2011-04-12 15:57:55
【问题描述】:

这是我在应用中的导航

1) homescreenview 控制器-->composemessageviewcontroller(我可以使用委托将数据发送回homescreenview)

2)homescreenview 控制器 -->messageslistcontroller(tableview)-->detailmessageviewcontroller(这是我的回复按钮所在的位置)。

我的问题是,当我点击回复时,我想用委托将信息发送回 homescreenviewcontroller。我该怎么做?

提前致谢。

----更新

@XJones,感谢您的详细解释。这是我推送详细视图时应该做的事情吗?如果我错了,请纠正我。

  • (void)pushDetailMessageController{ DetailMessagetController *detailmessage = [[DetailMessagetController alloc] init]; detailmessage.delegate = 自我; // 在此处将 messageListController 推送到导航控制器上 [详细发布]; }

【问题讨论】:

    标签: iphone objective-c delegates


    【解决方案1】:

    这是一个非常笼统的问题。您基本上是在询问如何将信息从一个控制器传递到另一个控制器。有不同的方法可以做到这一点,协议(委托通常通过什么进行通信)就是其中之一。如果您在代码中不做假设(以后可能会出现问题),那么您可以做的最快的事情是在您推送messageListController 然后detailMessageController 时传递 homeScreenController。为此,您需要在 messageListControllerdetailMessageController 中定义 iVar 和属性。

    类似:

    messageListController.h:

    #import "HomeScreenController.h"
    
    @interface messageListController : UITableViewController {
        // your iVars
        HomeScreenController *homeScreenController;
    @end
    
    @property (nonatomic, assign)    HomeScreenController *    homeScreenController;
    

    homeScreenController 的相同iVar 和属性添加到detailMessageController

    homeScreenController.h:

    - (void)pushMessageListController
    {
        MessageListController *messageListController = [[MessageListController alloc] init];
        messageListController.homeScreenController = self;
        // push messageListController onto navigation controller here
        [messageListController release];
    }
    

    messageListController 中创建和推送detailMessageController 时执行与上述相同的操作。现在,您可以在detailMessageController 中直接向homeScreenController 发送消息。

    如果您想概括上述实现以使您的控制器彼此之间没有具体的了解,那么您可以定义一个协议并将homeScreenController 作为支持该协议的委托传递。

    【讨论】:

    • 感谢您的详细解释。这是我推送详细视图时应该做的事情吗?如果我错了,请纠正我。 - (void)pushDetailMessageController { DetailMessagetController *detailmessage = [[DetailMessagetController alloc] init]; detailmessage.delegate = 自我; // 在此处将 messageListController 推送到导航控制器上 [详细发布]; }
    • 不,我的示例没有使用协议或定义delegate iVar & 属性。如果您使用我的示例来推送detailViewController,您将执行与推送messageListController 时相同的操作。在 alloc/init 之后,将其 homeScreenController 属性设置为传递给 messageListControllerhomeScreenController 实例。
    【解决方案2】:

    在消息列表控制器中添加一个方法怎么样?我个人会将委托“homescreenview”添加到 detailmessageviewcontroller,因为 messageslistcontroller 与回复没有任何关系,而 homescreenviewcontroller 显然是这样做的。

    当您在 messageslistcontroller 中创建 detailmessageviewcontroller 时,请执行以下操作:

    detailmessageviewcontroller.homeScreenDelegate = self.delegate;
    

    【讨论】:

      【解决方案3】:

      一种方法(无委托)

      因为您使用的是navigationController,所以 [[self.navigationController viewControllers]objectAtIndex:0] 将永远返回你homeScreenViewController.....你可以使用这个对象......

      谢谢,

      【讨论】:

      • 如果你有直接调用,那么我们不应该使用委托或通知,它会增加应用程序的开销。
      • 您的回答很好,尽管这意味着控制器将对位于导航堆栈根目录的对象做出假设。对于特定的应用程序,您可以这样做。我更喜欢实现我的类,以便它们被封装并且易于重用。这正是协议(由代表使用)和通知的作用。你的评论是错误的。这两种方法都没有增加有意义的开销。委托只是一个指针(保留或分配),通知在 iOS 中广泛使用。
      • @XJones 我完全按照您所说的进行了尝试,我可以从 detailview 向主屏幕控制器发送消息。但我仍然对这种方法有一个警告。由于主屏幕对象是详细视图中的实例变量,当我向主屏幕对象发送消息时,它显示“找不到方法 xxx(返回类型将默认为 id)”
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-01
      • 1970-01-01
      • 2017-04-08
      • 2021-03-12
      • 1970-01-01
      • 2020-03-20
      相关资源
      最近更新 更多