2014-10-01 91 views
3

我的應用程序中有1列是類型數組。我只想把那個數組中的項放到我的UITableView中,但是我有一些問題,因爲numberOfRows只能得到1,因爲只有一行,但我想要統計那行的數組而不是行本身。從解析列獲取數組到UITableView

我該如何用PFQueryTableViewController實現這個功能?

下面是我的一些「實驗代碼」與此:

#import "ReviewsViewController.h" 
#import "MyManager.h" 

@interface ReviewsViewController() { 
// Declare variables 
int totalCount; 
int currentReview; 
} 

@end 

@implementation ReviewsViewController 

- (id)initWithCoder:(NSCoder *)aCoder { 
self = [super initWithCoder:aCoder]; 
if (self) { 

    // Setup currentReview 
    currentReview = 0; 

    // The className to query on 
    self.parseClassName = @"Story"; 

    // The key of the PFObject to display in the label of the default cell stlye 
    self.textKey = @"objectId"; 

    // Whether the built-in pull-to-refresh is enabled 
    self.pullToRefreshEnabled = YES; 

    // Whether the built-in pagination is enabled 
    self.paginationEnabled = NO; 
} 
return self; 
} 

- (PFQuery *)queryForTable { 
PFQuery *query = [PFUser query]; 
query = [PFQuery queryWithClassName:self.parseClassName]; 
[query whereKey:@"Title" equalTo:[[MyManager sharedManager] selectedStory]]; 

return query; 
} 

- (void)viewDidLoad { 
[super viewDidLoad]; 
// Do any additional setup after loading the view. 

// Setup totalCount 
totalCount = 1; 
} 

-(void)viewWillAppear:(BOOL)animated { 
[super viewWillAppear:YES]; 
// Set the delegate(s) and datasource 
_reviewsTableView.delegate = self; 
_reviewsTableView.dataSource = self; 
} 

- (void)didReceiveMemoryWarning { 
[super didReceiveMemoryWarning]; 
// Dispose of any resources that can be recreated. 
} 

#pragma mark - Table view data source 

-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { 
// Return the number of sections 
return 1; 
} 

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 
// Return the number of objects in the section 
NSArray *reviews = [[NSArray alloc] init]; 
for (PFObject *object in [self objects]){reviews = (NSArray *)[object objectForKey:@"Reviews"];} 
totalCount = reviews.count; 
NSLog(@"%@%d", @"count: ", totalCount); 

return totalCount; 
} 

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath object:(PFObject *)object { 

static NSString *simpleTableIdentifier = @"cell"; 

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier]; 

if (cell == nil) { 
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:simpleTableIdentifier]; 
} 

// Configure the cell 
UILabel *reviewLabel = (UILabel *)[cell viewWithTag:10]; 
NSArray *reviews = [[NSArray alloc] init]; 
for (PFObject *object in [self objects]){reviews = (NSArray *)[object objectForKey:@"Reviews"];} 
reviewLabel.text = reviews[currentReview]; 
currentReview++; // Increase it for next time 

return cell; 
} 

@end 

我有一種感覺,這個代碼是沒有多大用處,但我們的目標是拿到1所有數組項排成一個UITableView - 問題是,如何?

UPDATE

我的 「新」 的代碼給了我這個錯誤:

Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayM objectAtIndex:]: index 1 beyond bounds [0 .. 0]' 

以下是相應的代碼:

#import "ReviewsViewController.h" 
#import "MyManager.h" 

@interface ReviewsViewController() { 
// Declare variables 
NSArray *myObjects; 
} 

@end 

@implementation ReviewsViewController 

- (id)initWithCoder:(NSCoder *)aCoder { 
self = [super initWithCoder:aCoder]; 
if (self) { 

    // The className to query on 
    self.parseClassName = @"Story"; 

    // The key of the PFObject to display in the label of the default cell stlye 
    self.textKey = @"objectId"; 

    // Whether the built-in pull-to-refresh is enabled 
    self.pullToRefreshEnabled = YES; 

    // Whether the built-in pagination is enabled 
    self.paginationEnabled = NO; 
} 
return self; 
} 

- (void)objectsDidLoad:(NSError*)error { 
[super objectsDidLoad:error]; 
// Extract out the desired array and assign it to myObjects 
myObjects = [[NSArray alloc] init]; 
for (PFObject *object in [self objects]){ 
    myObjects = (NSArray*)[object objectForKey:@"Reviews"]; 
} 
[self.tableView reloadData]; 
} 

- (PFQuery *)queryForTable { 
PFQuery *query = [PFUser query]; 
query = [PFQuery queryWithClassName:self.parseClassName]; 
[query whereKey:@"Title" equalTo:[[MyManager sharedManager] selectedStory]]; 

return query; 
} 

- (void)viewDidLoad { 
[super viewDidLoad]; 
// Do any additional setup after loading the view. 
} 

-(void)viewWillAppear:(BOOL)animated { 
[super viewWillAppear:YES]; 
// Set the delegate(s) and datasource 
_reviewsTableView.delegate = self; 
_reviewsTableView.dataSource = self; 
} 

- (void)didReceiveMemoryWarning { 
[super didReceiveMemoryWarning]; 
// Dispose of any resources that can be recreated. 
} 

#pragma mark - Table view data source 

-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { 
// Return the number of sections 
return 1; 
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 
return myObjects.count; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath object:(PFObject *)object { 
static NSString *simpleTableIdentifier = @"cell"; 
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier]; 

if (cell == nil) { 
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:simpleTableIdentifier]; 
} 

// Configure the cell using myObjects 
UILabel *reviewLabel = (UILabel *)[cell viewWithTag:10]; 
reviewLabel.text = [myObjects objectAtIndex:indexPath.row]; 

return cell; 
} 

@end 

在這裏你可以看到,這兩個項目在陣列中下載:

enter image description here enter image description here enter image description here

謝謝! Erik

回答

1

有幾個選擇,但這是我認爲最簡單的選擇。

1)創建一個新的成員變量,調用它myObjects:

NSArray *myObjects; 

2)重寫objectsDidLoad:

- (void)objectsDidLoad:(NSError*)error { 
    [super objectsDidLoad:error]; 
    // Extract out the desired array and assign it to myObjects 
    myObjects = [[NSArray alloc] init]; 
    for (PFObject *object in [self objects]){ 
     myObjects = (NSArray*)[object objectForKey:@"Reviews"]; 
    } 
    [self.tableView reloadData]; 
} 

3)過載objectAtIndexPath:

- (PFObject*) objectAtIndexPath:(NSIndexPath*)indexPath { 
    PFObject *object = [PFObject objectWithClassName: @"Object"]; 
    [object setObject:[myObjects objectAtIndex:indexPath.row] forKey:@"string"]; 
    return object; 
} 

4)使用numberOfRowsInSection的myObjects:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 
    return myObjects.count; 
} 

5)使用您的自定義對象的cellForRowAtIndexPath:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath object:(PFObject *)object { 
    static NSString *simpleTableIdentifier = @"cell"; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier]; 

    if (cell == nil) { 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:simpleTableIdentifier]; 
    } 

    // Configure the cell using object 
    UILabel *reviewLabel = (UILabel *)[cell viewWithTag:10]; 
    reviewLabel.text = [object objectForKey:@"string"]; 

    return cell; 
} 
+0

看起來不錯,但應該是在queryForTable方法是什麼? – Erik 2014-10-01 18:59:36

+0

沒關係,看我更新的問題請 – Erik 2014-10-01 19:01:28

+0

什麼行導致錯誤?請放入斷點。 – Dehli 2014-10-01 19:08:46