UIViewController存在和关闭

时间:2019-10-14 13:02:15

标签: ios objective-c

我的代码中有3个viewControllers。我编写了代码以从第一个视图控制器呈现第三个视图控制器。

第3个视图控制器中有2个按钮(完成和取消)。当我点击完成按钮时,第2个视图控制器需要出现。

如何为此编写代码?

2 个答案:

答案 0 :(得分:0)

首先,我建议您必须搜索并查看Objective-C文档和示例。但是存在如何呈现UIViewController的基础。

SecondViewController *controller = [SecondViewController new];

如果您想使用完成块

[self presentViewController:controller animated:YES completion:^{

}];

或者如果您只是想使用它的话。

[self presentViewController:controller animated:YES completion:nil];

//编辑部分

所以我假设按钮如下。

UIButton *toGoSecond;
UIButton *toGoThird;

然后通过viewDidLoad方法,可以assign这些按钮的操作。

[toGoSecond addTarget:self action:@selector(goToSecond) forControlEvents:UIControlEventTouchUpInside];
    [toGoThird addTarget:self action:@selector(goToThird) forControlEvents:UIControlEventTouchUpInside];

还有演示处理程序功能。

-(void) goToSecond{
    SecondController *second = [SecondController new];
    [self presentViewController:second animated:TRUE completion:nil];
}

-(void) goToThird{
    ThirdController *thirdController = [ThirdController new];
    [self presentViewController:thirdController animated:TRUE completion:nil];
}

我认为稍作搜索和查看教程可以使您清楚自己的问题,希望编辑后的答案对您有所帮助。

  

//最后编辑

嘿,当我回答这个问题时我无法完全解决您的问题,但是我可以通过委派模式来解决您的问题。

我已经创建了3个名为ViewControllerSecondViewControllerThirdViewController的控制器。

所以我们开始吧。

创建协议。

@protocol ProtocolName
-(void) go;
@end

然后按如下所示将其分配给您的第一个视图控制器。

@interface ViewController : UIViewController<ProtocolName>

在ViewController.m文件中填充go方法。

- (void)go{
    NSLog(@"triggered");
    SecondViewController *second = [SecondViewController new];
    [self presentViewController:second animated:TRUE completion:nil];
}

然后在ThirdController.h文件中将delegate作为weak变量。

@interface ThirdViewController : UIViewController
@property (nonatomic,weak) id<ProtocolName> delegate;
@end

ThirdViewController转到FirstViewController之前,先分配其委托,如下所示。

-(void) goToThird{
    ThirdViewController *thirdController = [ThirdViewController new];
    [thirdController setDelegate:self];
    [self presentViewController:thirdController animated:TRUE completion:nil];
}

然后,如果您按下当前SecondViewController的按钮,请实施如下所示的按钮操作方法。

- (void) targetMethod{
    [self dismissViewControllerAnimated:YES completion:nil];
    [_delegate go];
}

首先,您必须解雇当前的ThirdViewController,然后代表才能进行工作并出示SecondViewController

答案 1 :(得分:0)

您可以使用委托。 您可以使用Delegate调用1st View controller方法,以从第3个View Controller完成按钮显示第2个View Controller

示例代码: FirstViewController.swift

[ { id: 2,
    name: 'woda',
    price: 45.98,
    quantity: 3,
    createdAt: 2019-07-23T17:50:43.033Z,
    updatedAt: 2019-07-23T17:50:43.033Z,
    shopId: 2 },
  { id: 3,
    name: 'sham',
    price: 69.98,
    quantity: 4,
    createdAt: 2019-07-23T17:50:43.033Z,
    updatedAt: 2019-07-23T17:50:43.033Z,
    shopId: 2 } ]

SecondViewController.swift

import UIKit

public protocol GoToSecondVCDelegate : class {
func gotoSecondVC()
}

class FirstViewController: UIViewController, GoToSecondVCDelegate   {

override func viewDidLoad() {
    super.viewDidLoad()

}

@IBAction func gotoThirdVC(sender : UIButton){
    let thirdVC = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "ThirdViewController") as! ThirdViewController
    thirdVC.delegate = self
    self.present(thirdVC, animated: true, completion: nil)
}
func gotoSecondVC() {
    let secondVC = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "SecondViewController") as! SecondViewController
    self.present(secondVC, animated: true, completion: nil)
}
}

ThirdViewController.swift

import UIKit

class SecondViewController: UIViewController {

override func viewDidLoad() {
    super.viewDidLoad()

    // Do any additional setup after loading the view.
}
@IBAction func cancelClick(sender : UIButton)
{
    self.dismiss(animated: true, completion: nil)

}
}