1

伙计们,我在 XCODE4.5 中遇到了一些麻烦,希望您能帮助我!

如何使用方法 didSelectRowAtIndexPath 将 UITableViewController 中选定行的整数值传递或发送到另一个 ViewController?

这是我的代码:

SecondViewController.h
{
NSInteger myInteger;
}
@property(nonatomic) NSInteger myInteger;

SecondViewControl.m
-(void)viewDidLoad {
NSLog(@" the number is = %d",myInteger); //this is not working, I always get "the number is = 0 "
}


FirstViewController.h
#import "SecondViewController"
//...

FirstViewController.m
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath  *)indexPath {
if (indexPath) {
 NSIndexPath *path = indexPath;
    NSInteger theInteger = path.row;
 NSLog(@"selected row = %d", theInteger); //code OK

//THE PROBLEM STARTS HERE!!!!!!!!!!!!!!!!!!   

SecondViewController *second = [[SecondViewController alloc]init];
    [second setMyInteger:theInteger];
// i'm trying to use "second.myInteger = theInteger;" , but it's also not working

}
}

谢谢你们!

4

3 回答 3

1

嗨,我认为您缺少合成 myInteger Veriable 修改您的 secondviewcontroller.m 文件

SecondViewControl.m

@synthesize myInteger;

-(void)viewDidLoad {
    NSLog(@" the number is = %d",myInteger); 
}

希望这会帮助你:)

于 2012-10-17T18:49:32.673 回答
1

您的myIntegeriVar 未使用编译器如何生成 iVar 并自动为属性合成 getter/setter。

编译器会在您声明属性时为您提供帮助,因此您无需声明自己的 iVar 或使用 @synthesize,除非您想要默认以外的行为。

@property(nonatomic) NSInteger myInteger;行使编译器在您的实现中生成以下等效项。

@synthesize myInteger = _myInteger;

因此,被默认设置器修改的 iVar 是_myInteger.

您可以在 SecondViewController 中执行以下操作之一。我更喜欢解决方案#1 b/c,它更简洁,代码更少,并利用了自动编译器行为。

  1. 在 SecondViewController.h 中删除myIntegeriVar 并在 SecondViewController.m 中将任何对 iVar 的引用更改为_myIntegerself.myInteger

或者

  1. 在 SecondViewController.m 中,通过添加显式合成属性以使用您的 iVar@synthesize myInteger;

编辑:添加具体示例

// SecondViewController.h
@interface SecondViewContoller : UIViewController
@property(nonatomic) NSInteger myInteger;
@end

// SecondViewControl.m
-(void)viewDidLoad {
    NSLog(@" the number is = %d", self.myInteger);
}

// FirstViewController.h
#import "SecondViewController"
//...

// FirstViewController.m
//
// rest of implementation
//
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath  *)indexPath
{
    if (indexPath) {
        NSIndexPath *path = indexPath;
        NSInteger theInteger = path.row;
        NSLog(@"selected row = %d", theInteger);

        SecondViewController *second = [[SecondViewController alloc] init];
        second.myInteger = theInteger;
        // you need to present second somehow, viewDidLoad won't be called until then
        // example if using a navigationController
        [self.navigationController pushViewController:second animated:YES];
    }
}
于 2012-10-17T19:05:25.843 回答
0

prepareForSegue:sender:假设您在 Xcode 4.5 中使用 Storyboard,则应该在方法中将参数传递给下一个参数。

- (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"])
    {
       SecondViewController *second = (SecondViewController *)segue.destinationViewController;
       second.selectedIndex = selectedIndex;
    }
}

然后在您的 didSelectRowAtIndexPath: 方法中,您可以执行 segue:

[self performSegueWithIdentifier:@"YOUR_SEGUE_NAME_HERE"];

假设您在 SecondViewController 的头文件中有一个属性,它应该再次将参数传递给您的第二个视图,如下所示:

@property (nonatomic, assign) int *selectedIndex;

编辑:

在您尝试执行的操作的上下文中,您可以轻松地在顶部的 FirstViewController 中创建一个私有属性,并将您的 selectedIndex 从您的 didSelectRowAtIndexPath: 存储在那里并在 prepareForSegue 中传递它:

@interface FirstViewController() {
    int selectedIndex;
}

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath  *)indexPath {
    selectedIndex = indexPath.row
}
于 2012-10-17T18:15:23.717 回答