3

我正在尝试做一个 ios 应用程序,但我被困在类之间传递数据。这是我的第二个应用程序。第一个是用一个全局类完成的,但现在我需要多个类。我尝试了许多教程,但没有奏效或传递的值始终为零。有人可以给我写一个简单的应用程序来演示 IOS 5 中的变量传递。没什么特别的,故事板带有 2 个视图控制器,一个变量。

感谢您的帮助 。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    // Navigation logic may go here. Create and push another view controller.

            FirstViewController *fv;
            fv.value = indexPath.row;

            NSLog(@"The current %d", fv.value);

            FirstViewController *detail =[self.storyboard instantiateViewControllerWithIdentifier:@"Detail"];
            [self.navigationController pushViewController:detail animated:YES]; 

}

这是我的主视图中的代码,我需要将 indexPath.row 或我按下的单元格的索引发送到下一个视图

4

3 回答 3

12

有几件事要做。根据应用程序,您可以向 AppDelegate 类添加一个变量,使其通过共享实例可用于所有类。最常见的事情(我认为)是做一个单例。为此,您可以创建一个类,比如 StoreVars,以及一个返回对象的静态方法,这使得类“全局”。在该方法中,您可以像往常一样初始化所有变量。然后,您可以随时从任何地方联系到他们。

@interface StoreVars : NSObject

@property (nonatomic) NSArray * mySharedArray;
+ (StoreVars*) sharedInstance;

@implementation StoreVars
@synthesize mySharedArray;

+ (StoreVars*) sharedInstance {
    static StoreVars *myInstance = nil;
    if (myInstance == nil) {
        myInstance = [[[self class] alloc] init];
        myInstance.mySharedArray = [NSArray arrayWithObject:@"Test"];
    }
    return myInstance;
}

这将产生一个单例。如果你记得在你的两个视图控制器中导入“StoreVars.h”,你可以像这样访问现在共享的数组;

[StoreVars sharedInstance].mySharedArray;
               ^

这是一个返回 StoreVars 对象的方法。在 StoreVars 类中,您可以实现任何对象并在静态方法中对其进行初始化。只要记住初始化它,否则,你所有的对象都将是 0/nil。

如果你不是 UINavigationController 的粉丝并且宁愿使用 segues,它会容易得多,但会使你的应用程序相当“混乱”。UIViewController 中实现了一个方法,你应该重载:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    // Make sure your segue name in storyboard is the same as this line
    if ([[segue identifier] isEqualToString:@"YOUR_SEGUE_NAME_HERE"])
    {
        // Get reference to the destination view controller
        YourViewController *vc = [segue destinationViewController];

        // Pass any objects to the view controller here, like...
        [vc setMyObjectHere:object];
    }
}

来源:如何通过prepareForSegue:一个对象

在问这样的问题之前做一些研究。阅读一些教程,亲自尝试,然后提出与您真正需要的内容相关的问题。不是每天人们都想为你做所有的工作,但有时你很幸运。好像今天。

干杯。

于 2012-05-18T08:57:55.480 回答
1

如果您在 2 个控制器之间使用 segue,则必须重载 prepareToSegue 方法

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
// check if it's the good segue with the identifier
if([[segue identifier] isEqualToString:@"blablabla"])
{
    // permit you to get the destination segue
    [segue destinationViewController];
    // then you can set what you want in your destination controller
}
}
于 2012-05-18T08:53:59.373 回答
1

你面临的问题对于初学者来说是相当令人困惑的。以错误的方式“解决”它可能会导致学习大量的坏习惯。
请看一看Ole Begemann的关于在视图控制器之间传递数据的优秀教程——它真的很值得一读。

于 2012-05-18T09:30:09.580 回答