在编写我的iphone应用程序时遇到数字问题。我想将一个数字(可能最终是一个数组)从一个视图控制器传递给另一个视图控制器。我已设法做到这一点将字符串,但我只是无法弄清楚数字。这就是我的......
PrimaryViewController.h
@interface PrimaryTimerViewController : UIViewController {
IBOutlet UITextField *name;
int *number;
}
-(IBAction)submit;
@end
PrimaryViewController.m
-(void)submit{
SecondaryTimerViewController *Second = [SecondaryTimerViewController alloc];
Second.name = name.text;
Second.number = 5; //causes an error
[self.view addSubview:Second.view];
}
SecondaryViewController.h
@interface SecondaryTimerViewController : UIViewController {
IBOutlet UILabel *secondaryLabel;
NSString *name;
int *number;
}
@property (nonatomic, retain) NSString *name;
@property (nonatomic) int number;
@end
SecondaryViewController.m
- (void)viewDidLoad {
secondaryLabel.text = name;
int num = number; //gives a cast warning
[super viewDidLoad];
}
如果有人能够对此有所了解,那就太棒了。我是新手,并且已经谷歌搜索了几个小时: - (
答案 0 :(得分:1)
Objective-C中的标准做法是使用init
方法(或重载)初始化这些内容,而不是在alloc
调用后直接在对象上设置这些工具。实际上,UIViewController
需要才能在调用许多方法之前进行初始化。大多数(如果不是全部)Cocoa类(以及你实现的类)都需要在它们可以/应该被使用之前进行初始化。
您是以编程方式(在loadView中)还是在NIB中创建视图(在SecondaryViewController中)?在任何一种情况下,在SecondaryViewController.h中创建一个新的重载:
-(id)initWithName:(NSString*)name number:(int)num;
然后在您的.m
文件中:
-(id)initWithName:(NSString*)name number:(int)num
{
if (self = [super init]) // or [super initWithNib:...] if you are using a NIB.
{
self.name = name;
self.number = num;
}
return self;
}
然后在PrimaryViewController中:
SecondaryTimerViewController *Second = [[SecondaryTimerViewController alloc] initWithName:name.text number:5];
[self.view addSubview:Second.view];
您的另一个问题是您在SecondaryViewController.h中输入的ivar不正确:
int* number;
应阅读:
int number;
答案 1 :(得分:0)
你可以使用杰森的方法,或者你可以使用单身人士。我喜欢使用单例,因为我可以随处访问它,并且它的内存效率很高。
如果您想开始使用单身人士,可以使用以下.h和.m:
#import <Foundation/Foundation.h>
@interface Board : NSObject {
NSInteger number;
}
@property (nonatomic) NSInteger number;
+ (Board *) instance;
@end
实施:
#import "Board.h"
@implementation Board
@synthesize number;
static Board *sharedBoard = nil;
+ (Board *) instance {
@synchronized(self) {
if(sharedBoard == nil)
sharedBoard = [[self alloc] init];
}
return sharedBoard;
}
+ (id)allocWithZone:(NSZone *)zone {
@synchronized(self) {
if(sharedBoard == nil) {
sharedBoard = [super allocWithZone:zone];
return sharedBoard;
}
}
return nil;
}
- (id) copyWithZone:(NSZone *)zone {
return self;
}
- (id) retain {
return self;
}
- (unsigned) retainCount {
return UINT_MAX;
}
- (void) release {
[contents release];
}
- (id) autorelease {
return self;
}
@end
这允许您将Board.h
包含到任何实现文件中,并通过以下方式访问它:
- (void) viewDidLoad {
Board *board = [Board instance];
board.number = 15;
}
另一种方法是将它包含在标题中,并将其设置为变量,以便在所有方法中都可用。这种方法有什么好处,你可以访问同一个实例,而不需要在你的委托中创建一个新实例。