我的代码中有3个viewControllers。我编写了代码以从第一个视图控制器呈现第三个视图控制器。
第3个视图控制器中有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个名为ViewController
,SecondViewController
,ThirdViewController
的控制器。
所以我们开始吧。
创建协议。
@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)
}
}