在视图控制器之间有很多 segues 可以吗?
Is it okay to have a lot of segues between view controllers?
所以我对 iOS 开发还很陌生,因此决定冒险走 swift 这条路。我现在正在使用多个视图控制器并在它们之间传递数据,我想知道在 2 个视图控制器之间设置多个(例如 9-15 个)segue 是否是不好的做法?
基本上我拥有的是带有 9 个不同按钮的普通 VC。现在,我想要的是每个按钮将不同的数据发送到后续的选项卡 VC,而不是每个 button/catagory.
都有不同的 VC
看起来像这样:
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
let tabBarController = segue.destinationViewController as! UITabBarController
let svc = tabBarController.viewControllers![0] as! InfoViewController
let svc2 = tabBarController.viewControllers![1] as! DIYViewController
if segue.identifier == "wind" {
svc.titleString = "Wind Power... what a powerful thing"
} else if segue.identifier == "geothermal" {
//send info about geothermal
} else if segue.identifier == "hydroelectric" {
//send infor about hydroelectricity
} else if segue.identifier == "" {
//code
} else if segue.identifier == "" {
//code
} else if segue.identifier == "" {
//code
} else if segue.identifier == "" {
//code
}
}
有没有更传统的方法来完成这个?
你应该只有一个segue,并在prepareForSegue(_:sender:)
中传递数据。例如。在您的第一个视图控制器中,您传递变量:
class ViewController: UIViewController {
var myVariable: String!
@IBAction func button1Action(sender: AnyObject) {
myVariable = "Hello"
}
@IBAction func button2Action(sender: AnyObject) {
myVariable = "Hola"
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue == "MySegue" {
let secondViewController = segue.destinationViewController as! ViewController
secondViewController.myVariable = myVariable
}
}
}
在你的第二个视图控制器中,你可以用你的变量做任何你想做的事:
class SecondViewController: UIViewController {
var myVariable: String!
override func viewDidLoad() {
title = myVariable
}
}
您可以创建一个 NSObject
子类(例如 MyAtmospherologyObject
)并将所有需要的属性放入其中以存储您可能需要的所有 9 个类别的所有信息。
然后给它一个 type 属性 并使用 enum
作为唯一的 segue 来确定它得到了什么以及它应该如何处理其余的数据。
此后,您只需发送一个对象,即MyAtmospherologyObject
。这可能很有用,因为您可以在初始化对象后将其作为一个整体传递到任何地方,并从那里重用它。
例如Objective-C(我知道这不是 Swift,但你明白了。)
MyAtmospherologyObject.h
//
// MyAtmospherologyObject.h
//
@import Foundation;
typedef NS_ENUM(NSUInteger, MyAtmospherologyType) {
MyAtmospherologyGeothermalType = 0,
MyAtmospherologyHydroelectricType
};
@interface MyAtmospherologyObject : NSObject
@property (nonatomic) MyAtmospherologyType type;
@property (nonatomic, strong) NSString *mySting;
- (MyAtmospherologyType)type;
@end
MyAtmospherologyObject.m
//
// MyAtmospherologyObject.m
//
#import "MyAtmospherologyObject.h"
@implementation MyAtmospherologyObject
- (instancetype)initWithType:(MyAtmospherologyType)aType
{
self = [super init];
if (self) {
_type = aType;
}
return self;
}
#pragma mark - NSKeyedArchiver
- (id)initWithCoder:(NSCoder *)decoder
{
if (self = [super init]) {
_type = [decoder decodeIntegerForKey:@"type"];
_mySting = [decoder decodeObjectForKey:@"mySting"];
}
return self;
}
- (void)encodeWithCoder:(NSCoder *)encoder
{
[encoder encodeInteger:_type forKey:@"type"];
[encoder encodeObject:_mySting forKey:@"mySting"];
}
#pragma mark - Methods
- (MyAtmospherologyObject)type
{
return _type;
}
@end
MyAtmospherologyViewController.m
// ...
#import "MyAtmospherologyObject.h"
@implementation MyAtmospherologyViewController
// ...
- (IBAction)buttonAction:(id)sender
{
MTKGSJournalQuestionnaireObject *object = [[MTKGSJournalQuestionnaireObject alloc] initWithType:MyAtmospherologyGeothermalType];
object.myString = @"aString";
[self performSegueWithIdentifier:@"MySegueIdentifier"
sender:object];
}
#pragma mark - UIStoryboardSegue
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
MyAtmospherologyObject *object = (MyAtmospherologyObject *)sender;
MyAtmospherologySegueViewController *vc = (MyAtmospherologySegueViewController *)segue.destinationViewController;
switch (object.type) {
case MyAtmospherologyGeothermalType:
vc.navigationItem.title = object.myString;
break;
case MyAtmospherologyHydroelectricType:
vc.navigationItem.title = object.myString;
break;
default:
break;
}
}
// ...
@end
所以我对 iOS 开发还很陌生,因此决定冒险走 swift 这条路。我现在正在使用多个视图控制器并在它们之间传递数据,我想知道在 2 个视图控制器之间设置多个(例如 9-15 个)segue 是否是不好的做法?
基本上我拥有的是带有 9 个不同按钮的普通 VC。现在,我想要的是每个按钮将不同的数据发送到后续的选项卡 VC,而不是每个 button/catagory.
都有不同的 VC看起来像这样:
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
let tabBarController = segue.destinationViewController as! UITabBarController
let svc = tabBarController.viewControllers![0] as! InfoViewController
let svc2 = tabBarController.viewControllers![1] as! DIYViewController
if segue.identifier == "wind" {
svc.titleString = "Wind Power... what a powerful thing"
} else if segue.identifier == "geothermal" {
//send info about geothermal
} else if segue.identifier == "hydroelectric" {
//send infor about hydroelectricity
} else if segue.identifier == "" {
//code
} else if segue.identifier == "" {
//code
} else if segue.identifier == "" {
//code
} else if segue.identifier == "" {
//code
}
}
有没有更传统的方法来完成这个?
你应该只有一个segue,并在prepareForSegue(_:sender:)
中传递数据。例如。在您的第一个视图控制器中,您传递变量:
class ViewController: UIViewController {
var myVariable: String!
@IBAction func button1Action(sender: AnyObject) {
myVariable = "Hello"
}
@IBAction func button2Action(sender: AnyObject) {
myVariable = "Hola"
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue == "MySegue" {
let secondViewController = segue.destinationViewController as! ViewController
secondViewController.myVariable = myVariable
}
}
}
在你的第二个视图控制器中,你可以用你的变量做任何你想做的事:
class SecondViewController: UIViewController {
var myVariable: String!
override func viewDidLoad() {
title = myVariable
}
}
您可以创建一个 NSObject
子类(例如 MyAtmospherologyObject
)并将所有需要的属性放入其中以存储您可能需要的所有 9 个类别的所有信息。
然后给它一个 type 属性 并使用 enum
作为唯一的 segue 来确定它得到了什么以及它应该如何处理其余的数据。
此后,您只需发送一个对象,即MyAtmospherologyObject
。这可能很有用,因为您可以在初始化对象后将其作为一个整体传递到任何地方,并从那里重用它。
例如Objective-C(我知道这不是 Swift,但你明白了。)
MyAtmospherologyObject.h
//
// MyAtmospherologyObject.h
//
@import Foundation;
typedef NS_ENUM(NSUInteger, MyAtmospherologyType) {
MyAtmospherologyGeothermalType = 0,
MyAtmospherologyHydroelectricType
};
@interface MyAtmospherologyObject : NSObject
@property (nonatomic) MyAtmospherologyType type;
@property (nonatomic, strong) NSString *mySting;
- (MyAtmospherologyType)type;
@end
MyAtmospherologyObject.m
//
// MyAtmospherologyObject.m
//
#import "MyAtmospherologyObject.h"
@implementation MyAtmospherologyObject
- (instancetype)initWithType:(MyAtmospherologyType)aType
{
self = [super init];
if (self) {
_type = aType;
}
return self;
}
#pragma mark - NSKeyedArchiver
- (id)initWithCoder:(NSCoder *)decoder
{
if (self = [super init]) {
_type = [decoder decodeIntegerForKey:@"type"];
_mySting = [decoder decodeObjectForKey:@"mySting"];
}
return self;
}
- (void)encodeWithCoder:(NSCoder *)encoder
{
[encoder encodeInteger:_type forKey:@"type"];
[encoder encodeObject:_mySting forKey:@"mySting"];
}
#pragma mark - Methods
- (MyAtmospherologyObject)type
{
return _type;
}
@end
MyAtmospherologyViewController.m
// ...
#import "MyAtmospherologyObject.h"
@implementation MyAtmospherologyViewController
// ...
- (IBAction)buttonAction:(id)sender
{
MTKGSJournalQuestionnaireObject *object = [[MTKGSJournalQuestionnaireObject alloc] initWithType:MyAtmospherologyGeothermalType];
object.myString = @"aString";
[self performSegueWithIdentifier:@"MySegueIdentifier"
sender:object];
}
#pragma mark - UIStoryboardSegue
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
MyAtmospherologyObject *object = (MyAtmospherologyObject *)sender;
MyAtmospherologySegueViewController *vc = (MyAtmospherologySegueViewController *)segue.destinationViewController;
switch (object.type) {
case MyAtmospherologyGeothermalType:
vc.navigationItem.title = object.myString;
break;
case MyAtmospherologyHydroelectricType:
vc.navigationItem.title = object.myString;
break;
default:
break;
}
}
// ...
@end