【问题标题】:Pass parameter when initializing table初始化表时传递参数
【发布时间】:2011-06-06 08:52:58
【问题描述】:

好吧,我完全被难住了。

这适用于 CouponListViewController.m:

- (void)viewWillAppear:(BOOL)animated {
     [super viewWillAppear:animated];
     self.couponList = [CouponDatabase database].couponList;
     self.title = @"Coupon List";
}

这在 CouponDetailViewController.m 中有效:

- (void)viewWillAppear:(BOOL)animated {
    CouponDetails *details = [[CouponDatabase database] couponDetails:_uniqueId];
    if (details != nil) {
        [_merchantNameLabel setText:details.merchantName];
        [_longDealLine1Label setText:details.longDealLine1];
        //....blah...blah//
    }
}

但是当我从这里更改 CouponDatabase.h 时(适用于上述内容):

@class CouponDetails;

@interface CouponDatabase : NSObject {
    sqlite3 *_database;
}

+ (CouponDatabase *)database;
- (NSArray *)couponList;
- (CouponDetails *)couponDetails:(int) uniqueId;

...到这个(如果我在方法中手动设置'selectedCategory'的值,它会起作用):

@class CouponList;
@class CouponDetails;

@interface CouponDatabase : NSObject {
    sqlite3 *_database;
}

+ (CouponDatabase *)database;
- (CouponList *)couponList:(int) selectedCategory;
- (CouponDetails *)couponDetails:(int) uniqueId;

然后将 CouponListViewController.m 更改为:

1    - (void)viewWillAppear:(BOOL)animated {
2       [super viewWillAppear:animated];
3       self.couponList = [[CouponDatabase database] couponList:_selectedCategory];
4       self.title = @"Coupon List";
5    }

我在上面的第 3 行收到此错误:

warning: incompatible Objective-C types 'struct CouponList *', 
expected 'struct NSArray *' when passing argument 1 of 'setCouponList:' 
from distinct Objective-C type

问题:'self.couponlist' 行的正确格式是什么,以便我可以将整数传递给 CouponDatabase 以在 couponList 方法中使用?

编辑:我知道couponDetails 现在是一个类而不是一个数组 - 我只是不知道如何格式化该行来初始化表数据。

我希望这是有道理的 - 对此的任何帮助将不胜感激。

提前致谢!

添加CouponListViewController.h:

#import <UIKit/UIKit.h>

@class CouponDetailsViewController;

@interface CouponListViewController : UITableViewController {

    NSArray *_couponList;
    CouponDetailsViewController *_couponDetails;
    int _selectedCategory;
 }

@property (nonatomic, retain) NSArray *couponList;
@property (nonatomic, retain) CouponDetailsViewController *couponDetails;
@property(nonatomic, assign) int selectedCategory;

@end

【问题讨论】:

  • 请添加您的“CouponListViewController.h”,问题可能是那里没有正确声明成员变量。

标签: iphone uitableview


【解决方案1】:

尝试将您的 CouponListViewController.h 更改为:

#import <UIKit/UIKit.h>

@class CouponDetailsViewController;

@interface CouponListViewController : UITableViewController {

    CouponList *_couponList;
    CouponDetailsViewController *_couponDetails;
    int _selectedCategory;
 }

@property (nonatomic, retain) CouponList *couponList;
@property (nonatomic, retain) CouponDetailsViewController *couponDetails;
@property(nonatomic, assign) int selectedCategory;

@end

哎呀,我把我的回复放在我自己的原始帖子中,应该把它放在这里:

编辑:好的,我按照 Robert 的建议对 CouponListViewController.h 进行了更改,并添加了 @class CouponList; 如下:

#import <UIKit/UIKit.h>

@class CouponList;
@class CouponDetailsViewController;

@interface CouponListViewController : UITableViewController {

    CouponList *_couponList;
    CouponDetailsViewController *_couponDetails;
    int _selectedCategory;
}

@property (nonatomic, retain) CouponList *couponList;
@property (nonatomic, retain) CouponDetailsViewController *couponDetails;
@property(nonatomic, assign) int selectedCategory;

@end

我仍然在 CouponListViewController.m 中遇到错误:

#import "CouponListViewController.h"
#import "CouponDatabase.h"
#import "CouponList.h"
#import "CouponDetailsViewController.h"

@implementation CouponListViewController
@synthesize couponList = _couponList;
@synthesize couponDetails = _couponDetails;
@synthesize selectedCategory = _selectedCategory;

 - (void)viewWillAppear:(BOOL)animated {

     [super viewWillAppear:animated];
     self.couponList = [CouponDatabase database].couponList; // <--- ERROR 1
     self.title = @"Coupon List";
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return [_couponList count]; //  <--- WARNINGS 1 AND 2
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    if (self.couponDetails == nil) {
        self.couponDetails = [[[CouponDetailsViewController alloc] initWithNibName:@"CouponDetailsViewController" bundle:nil] autorelease];        
    }
    CouponList *info = [_couponList objectAtIndex:indexPath.row];  // <--- WARNING 3
    NSLog(@"%@", info.uniqueId);
    _couponDetails.uniqueId = info.uniqueId;
    [self.navigationController pushViewController:_couponDetails animated:YES];
}

错误 1:在非结构或联合的情况下请求成员“couponList”

警告 1:“CouponList”可能不会响应“-count”

警告 2:return 从没有强制转换的指针中生成整数

警告 3:“CouponList”可能不会响应“-objectAtIndex:”

【讨论】:

  • 好的,我改了,但现在还是有同样的错误,再加上 10 个……给我一点时间,我会试试看能不能弄明白。
  • 好的,我必须添加“@class CouponList;”到 CouponListViewController.h 的顶部,现在我又回到了同样的错误加上 3 个警告。我会在上面发布详细信息。
  • CouponListViewController.m 文件中是否有 CouponList 的#import?
  • 是的,它就在那里——我刚刚发布了 CouponListViewController.m 的那部分
【解决方案2】:

在 CouponDatabase 的原始代码中,您正在更改定义:

- (NSArray *)couponList;

对于这个:

- (CouponList *)couponList:(int) selectedCategory;

不过,您将该返回值用作列表视图控制器的数据源,因此 .在这里你有一个不匹配的地方,你应该修复。如何修复它取决于您的应用程序的语义。你想用- (CouponList *)couponList:(int) selectedCategory;做什么?真正返回这个选择器的是什么?接口CouponList是什么?可能你应该换行:

 self.couponList = [[CouponDatabase database] couponList:_selectedCategory];

以便它从 CouponList 返回一个 NSArray 构建。但我不确定你的对象的语义,所以可能不是这样。

【讨论】:

  • 谢谢 Sergio - 好的,我做了你建议的更改,它消除了错误,但 3 个警告仍然存在。我会尝试调查并弄清楚。我不确定我是否理解您的问题,但我正在尝试通过按下按钮来设置“selectedCategory”,然后将其传递给 CouponList 以便它根据按下的按钮返回一个列表,并将其呈现在表格视图中.非常感谢您查看我的问题!
  • @truthsmiles:实际上,我没有建议任何改变。我指的是不匹配。 :-) 你到底做了什么改变?
  • 哈哈 - 抱歉 - 我将更改为:self.couponList = [[CouponDatabase database] couponList:_selectedCategory];我觉得这是在正确的轨道上,你让我克服了一个重大障碍——现在我只需要学习更多。顺便说一句,与此同时,我正在开发另一个“测试”应用程序,以拥有一个带有自定义按钮的 UIViewController,按下该按钮将显示正确的表格视图。我刚刚解决了这个问题,所以我需要做的就是弄清楚如何将参数从按钮传递到 tableview,我的状态会很好!谢谢你的帮助!你们都太棒了!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-09
  • 2014-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-14
相关资源
最近更新 更多