在未通过segue连接的UIViewController和UITableViewController之间传递数据

时间:2014-01-30 20:49:12

标签: ios objective-c uiviewcontroller uitableview segue

我按照此链接Changing the value of a property of another UIViewController

的建议

我有一个登录页面,它连接到我下载的名为SWRevealViewController的github项目。它本质上为应用程序提供了一个滑出菜单。我需要将一个值从我的登录页面传递给使用SWRevealViewController加载的初始页面。似乎无法让它工作。谁能指出我正确的方向?我试过的是以下内容:

LoginViewController.m

#import "LoginViewController.h"
#import "ProfileTableViewController.h"

@interface LoginViewController ()
@property (strong, nonatomic) ProfileTableViewController *secondViewController;
@end

@implementation dbViewController

-(id)init
{
    if (self = [super init]) {
        self.secondViewController = [[ProfileTableViewController alloc] init];
    }
    return self;
}

- (BOOL)shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(id)sender{


    if([identifier isEqualToString:@"Login"]){
        [self login:sender];
        self.secondViewController.idNumber = _IDNumber;
        _secondViewController.idNumber = _IDNumber;            
            return YES;
     }    
}

LoginViewController.h

#import <UIKit/UIKit.h>
#import <sqlite3.h>
#import "ProfileTableViewController.h"

@interface LoginViewController : UIViewController

@property (strong, nonatomic)NSString *IDNumber;
@end

ProfileTableViewController.h

#import <CoreLocation/CoreLocation.h>
#import <UIKit/UIKit.h>
#import <sqlite3.h>

@interface ProfileTableViewController : UIViewController <CLLocationManagerDelegate, UITextFieldDelegate>
@property (nonatomic) NSString *idNumber;
@end

ProfileTableViewController.m

#import "ProfileTableViewController.h"
#import "SWRevealViewController.h"
#import "ProfileEditFieldController.h"

@interface ProfileTableViewController ()

@end

@implementation ProfileTableViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    NSLog(_idNumber);

}
@end

只是为了补充说明,两个蓝色控制器是Login,右边是三个控制器,其中一个是控制器我想传递的值为 enter image description here

2 个答案:

答案 0 :(得分:2)

你应该这样做:

-(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
        ProfileTableViewController *pvc = (ProfileTableViewController*)[segue destinationViewController];
        pvc.idNumber = _IDNumber

}

希望有效! :)

更新:

我认为您需要的是NSUserDefaults,使用它并存储ID。你会在不止一个控制器中需要它,我相信它很容易存储数据。

NSUserDefaults

答案 1 :(得分:1)

这并不是100%清楚你所展示的,但我假设这些视图控制器是在故事板中定义的,而且“Login”segue也在故事板中定义,并导致从LoginViewController转换到ProfileTableViewController。

我很困惑的一件事是为什么LoginViewController.m中的@implementation行说“dbViewController”,但我假设这是一个错字,它应该是“@implementation LoginViewController”。

因此,假设所有这些都是真的,那么代码中就会出现一些问题。首先,您不应该在LoginViewController的init方法中创建ProfileTableViewController。当执行segue时,iOS将自动分配并初始化ProfileTableViewController。

其次,不要使用shouldPerformSegueWithIdentifier:sender:,而是要使用prepareForSegue:sender:。调用该方法时,iOS已经创建了ProfileTableViewController,您可以设置属性。

所以,你想要的是:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([segue.identifier isEqualToString:@"Login"])
    {
        ProfileTableViewController * viewController = segue.destinationViewController;
        viewController.idNumber = _IDNumber;
    }
}