3

我在 ViewA 中有多个按钮。当一个按钮被点击时,它被重定向到 ViewB。在 ViewB 中,用户进行一些交互,然后在完成后单击返回按钮。如何运行方法并将参数从 ViewB 传递到 ViewA,然后继续在 ViewA 中工作?

强烈需要使用后退按钮,但我很想知道是否有其他方法。

我的想法是从堆栈中获取 ViewA,当我完成 ViewB 时,只需调用它并重定向,但我不知道该怎么做。

谢谢你。

4

5 回答 5

4

您想在 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
于 2012-11-23T19:04:29.810 回答
2

在 iOS6 中,您现在可以使用 Unwind Segues。在 Storyboard 中,您可能已经注意到可用于此目的的新退出按钮。

Unwind Segues 将允许您从 viewControllerB 转换回 viewControllerA 并通过 prepareForSegue 方法返回信息。

目前的文档相当有限,但是有一个有用的 WWDC2012 视频关于如何做到这一点(会议 236)

于 2012-11-23T19:31:07.133 回答
1

如果您不想实现协议,那么另一种方法是,您可以在 ViewB 中创建 id 类型的属性,如下所示

@property (nonatomic, unsafe_unretained) id* parentView;

并在像这样推送 ViewB 时将其设置为 ViewA

ViewB.parentView = ViewA; //推视图B

然后你可以直接使用这个属性调用 ViewA 的方法。

于 2012-11-23T19:10:08.677 回答
0

您可以在 ViewControllerA 中定义一个协议,例如名称 ViewControllerADelegate,在 ViewControllerB 中创建一个属性委托,并在 ViewControllerB 中实现 ViewControllerA 中定义的协议。

当您在 viewControllerB 中工作时,您可以将所有更改通知给 ViewControllerADelegate 中定义的 viewControllerA 调用方法,当您离开 viewControllerB 时,您将更新 viewControllerA。

于 2012-11-23T19:05:46.520 回答
0

如果您的 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];

于 2012-11-23T19:06:22.707 回答