我在 ViewA 中有多个按钮。当一个按钮被点击时,它被重定向到 ViewB。在 ViewB 中,用户进行一些交互,然后在完成后单击返回按钮。如何运行方法并将参数从 ViewB 传递到 ViewA,然后继续在 ViewA 中工作?
强烈需要使用后退按钮,但我很想知道是否有其他方法。
我的想法是从堆栈中获取 ViewA,当我完成 ViewB 时,只需调用它并重定向,但我不知道该怎么做。
谢谢你。
我在 ViewA 中有多个按钮。当一个按钮被点击时,它被重定向到 ViewB。在 ViewB 中,用户进行一些交互,然后在完成后单击返回按钮。如何运行方法并将参数从 ViewB 传递到 ViewA,然后继续在 ViewA 中工作?
强烈需要使用后退按钮,但我很想知道是否有其他方法。
我的想法是从堆栈中获取 ViewA,当我完成 ViewB 时,只需调用它并重定向,但我不知道该怎么做。
谢谢你。
您想在 ViewB 中定义一个委托并在 ViewA 中实现它。在适当的时候(例如,当点击后退按钮时)ViewB 调用委托方法,将值作为参数传递。
像这样的东西:
视图B.h
// Define a delegate protocol allowing
@protocol ViewBDelegate
// Method of delegate called when user taps the 'back' button
-(void) backButtonSelected:(id) object;
@end
@interface ViewB : UIViewController
// property to hold a reference to the delegate
@property (weak)id<ViewBDelegate> delegate;
-(IBAction)backButtonSelected:(id)sender;
@end
视图B.m:
@implementation ViewB
...
-(IBAction)backButtonSelected:(id)sender{
NSObject *someObjectOrValue = nil;
// Invoke the delegates backButtonSelected method,
// passing the value/object of interest
[self.delegate backButtonSelected:someObjectOrValue];
}
@end
视图A.h:
#import "ViewB.h"
// The identifier in pointy brackets (e.g., <>) defines the protocol(s)
// ViewA implements
@interface ViewA : UIViewController <ViewBDelegate>
...
-(IBAction)someButtonSelected:(id)sender;
@end
ViewA.m:
-(IBAction) someButtonSelected:id @implementation ViewA
...
// Called when user taps some button on ViewA (assumes it is "hooked up"
// in the storyboard or IB
-(IBAction)someButtonSelected:(id)sender{
// Create/get reference to ViewB. May be an alloc/init, getting from storyboard, etc.
ViewB *viewB = // ViewB initialization code
// Set `ViewB`'s delegate property to this instance of `ViewA`
viewB.delegate = self;
...
}
// The delegate method (defined in ViewB.h) this class implements
-(void)backButtonSelected:(id)object{
// Use the object pass as appropriate
}
@end
在 iOS6 中,您现在可以使用 Unwind Segues。在 Storyboard 中,您可能已经注意到可用于此目的的新退出按钮。
Unwind Segues 将允许您从 viewControllerB 转换回 viewControllerA 并通过 prepareForSegue 方法返回信息。
目前的文档相当有限,但是有一个有用的 WWDC2012 视频关于如何做到这一点(会议 236)
如果您不想实现协议,那么另一种方法是,您可以在 ViewB 中创建 id 类型的属性,如下所示
@property (nonatomic, unsafe_unretained) id* parentView;
并在像这样推送 ViewB 时将其设置为 ViewA
ViewB.parentView = ViewA; //推视图B
然后你可以直接使用这个属性调用 ViewA 的方法。
您可以在 ViewControllerA 中定义一个协议,例如名称 ViewControllerADelegate,在 ViewControllerB 中创建一个属性委托,并在 ViewControllerB 中实现 ViewControllerA 中定义的协议。
当您在 viewControllerB 中工作时,您可以将所有更改通知给 ViewControllerADelegate 中定义的 viewControllerA 调用方法,当您离开 viewControllerB 时,您将更新 viewControllerA。
如果您的 ViewA 正在创建 ViewB,您可以在 ViewB.h 上创建一个协议并将 ViewA 设置为 ViewB 的委托。所以每当你在 ViewB 中改变某些东西时,你可以直接通知 ViewA。
根据您的模型,您可以拥有一个包含您在 ViewB 中修改的任何设置的类。当你创建 ViewB 时,你通常会传递引用,因为它是一个对象,所以实例将被共享,所以当你回到 ViewA 时,所有的更改都已经应用了。
viewB.settings = self.settings; // or whatever model object you have
另一种选择是创建一个自定义后退按钮(您将失去尖利的外观),让它调用您的自定义方法来通知您的 ViewA,然后执行 [self.navigationController popViewControllerAnimated:YES];