更改视图控制器后重命名按钮

时间:2014-01-27 20:10:40

标签: ios uibutton

我不擅长用大段落解释,所以希望我要说的(应用程序将起作用的步骤)将有助于我的问题。

步骤:
1。打开应用。查看FirstViewController
2。按下代号为“initialButton”的按钮
3。切换到SecondViewController
4。按下按钮文本命名为“选择我”
5。退回到FirstViewController,让initialButton文本说“选择我”

FirstViewController.h

@interface FirstViewController : UIViewController

@property IBOutlet UIButton *initalButton;

@end

FirstViewController.m

- (void)viewWillAppear:(BOOL)animated {
     self.initalButton.titleLabel.text = name;
}

SecondViewController.m

selectMe = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[selectMe setFrame:CGRectMake(100, 100, 100, 100)];
[selectMe setTitle:@"Select Me" forState:UIControlStateNormal];
[selectMe addTarget:self action:@selector(someMethod:) forControlEvents:UIControlEventTouchUpInside];    

- (void) someMethod: (id)sender {
    if (sender == selectMe) {
         self.selectMe.titleLabel.text = name;
         [self.navigationController popViewControllerAnimated:YES];
    }
}

(NSObject)Background.h

NSString *name;

我的意图是当按下selectMe按钮时,应用程序返回一个ViewController,initalButton的文本显示在SecondViewController上按下的任何按钮。应用程序中的所有内容都在工作,除了让initialButton显示在SecondViewController上按下的按钮的文本(从上面的步骤5)。

2 个答案:

答案 0 :(得分:0)

您应该在2个控制器之间设置委托关系,以便在点击第二个控制器中的按钮时,它会在弹出之前使用选择信息回叫第一个控制器。然后第一个控制器可以在重新显示之前更新其状态。

答案 1 :(得分:0)

您要做的是设置委托关系。这允许您访问以前活动的ViewController中的属性。

我假设你在这个例子中使用故事板,但基本流程是这样的。在执行segue之前,调用prepareForSegue:sender:,我们首先检查segue是否正在使用SecondViewController。如果是,那么我们就可以进入并访问其属性。在这种情况下,我们想要的是委托。通过将self分配给委托,这允许我们在FirstViewController中执行任何我们想要的属性,同时我们仍然在SecondViewController中,因为我们现在有一个对父视图控制器的引用。好吧?你可以更改属性,运行方法调用等。这是非常有用的东西,你可能会使用它很多。

顺便说一下,您可能希望使用UIButton的setTitle:forState:方法来更改标题名称。

我不知道这段代码是否会编译,因为它依赖于你所做的我看不到的东西,但你至少可以理解它应该如何工作。祝你好运!

// FirstViewController.h

@interface FirstViewController : UIViewController

@property IBOutlet UIButton *initialButton;

@end

// FirstViewController.m

#import "SecondViewController.h"

- (void)viewWillAppear:(BOOL)animated 
{
     [self.initialButton setTitle:name forState:UIControlStateNormal];
}

- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    UIViewController *viewController = segue.destinationViewController;

    if ([viewController isKindOfClass:[SecondViewController class]) {
        SecondViewController *controller = (SecondViewController *)viewController;
        controller.delegate = self;
    }
}

// SecondViewController.h

@class FirstViewController;

@interface SecondViewController : UIViewController

@property (nonatomic, strong) FirstViewController *delegate;

@end

// SecondViewController.m

- (void)viewDidLoad 
{
    selectMe = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    [selectMe setFrame:CGRectMake(100, 100, 100, 100)];
    [selectMe setTitle:@"Select Me" forState:UIControlStateNormal];
    [selectMe addTarget:self action:@selector(someMethod:) forControlEvents:UIControlEventTouchUpInside];    
}

- (void) someMethod: (id)sender 
{
    if (sender == selectMe) {
         [self.delegate.initialButton setTitle:selectMe.titleLabel.text forState:UIControlStateNormal];
         [self.navigationController popViewControllerAnimated:YES];
    }
}