2016-04-05 35 views
0

我有我的主視圖控制器顯示UITableView。 這是每個單元格都是自定義的(我爲自定義演示文稿創建了一個UIView)。目標c - 有些數組項不顯示在我的UITableView中(有些顯示了兩次)

爲了顯示我的tableView這些項目,我填寫的「allFilesFolderPath」文件夾中的這段代碼內容的數組:

- (void)configureView { 
    _itemArray = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:allFilesFolderPath error:nil]; 
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 
    return [self.itemArray count]; 
} 

和創建我的定製單元用於向他們展示:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    NSUInteger row = [indexPath row]; 
    myItem = [self.itemArray objectAtIndex:row]; 
    NSLog(@"My Item : %@", _itemArray.description); 

    static NSString *CellIdentifer = @"cardCell"; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifer]; 

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

    return cell; 
} 

當我用打印數組,我得到的項目,按字母順序正確的列表(就像他們是如何存儲在文件位置在我的iPhone):

My Item : (
Music, 
Music10, 
Music2, 
Music3, 
Music4, 
Music5, 
Music6, 
Music7, 
Music8, 
Music9, 
Photos, 
Videos 
) 

但是,當我在iPhone上運行的應用程序(或在模擬器),單元格正確顯示(按順序),直到第八項。在這個數字之後,在我的情況下,而不是有「Music8」,「Music9」,「Photos」,「Video」我回到陣列的開頭,例如「Music」,「Music10」,「Music2」和「Music3 「

爲了更好地理解我所得到的,這裏是截圖:

enter image description here

enter image description here

我真的輸了!我搜索了(並再次搜索)我做錯了什麼,但我沒有找到任何東西,對我來說一切都是正確的。

請幫我找到我的問題,以便我可以正常睡覺。

編輯:這是我設置從我的其他類檢索myItem字符串的方法:

+ (NSString *)getItemName { 

    return myItem; 

} 

,這裏是我如何從我的其他類檢索:

NSString *test = [ViewController getItemName];  
_itemName.text = test; 

編輯2:這裏是用於設置我的自定義TableViewCell的代碼 (遺憾的是缺少這些信息)

#import "TableViewCell.h" 

@implementation TableViewCell 

- (void)awakeFromNib { 
    // Initialization code 

    [self cardSetup]; 

} 



- (void)setSelected:(BOOL)selected animated:(BOOL)animated { 
    [super setSelected:selected animated:animated]; 

    // Configure the view for the selected state 
} 



- (void)cardSetup { 

    _cardView.layer.masksToBounds = NO; 
    _cardView.layer.shadowOffset = CGSizeMake(0, 1); 
    _cardView.layer.shadowRadius = 1; 
    _cardView.layer.shadowOpacity = 0.3; 


    NSString *test = [ViewController getItemName];  
    _itemName.text = test; 

} 

@end 

回答

3

得到它有這個調用名爲「dequeueReusableCell ......」。表視圖單元格重用。如果8個單元格適合屏幕,並向上滾動視圖,則第九行將重用用於第一行的單元格。這就是爲什麼你必須在cellForRowAtIndexPath中設置你的單元格,顯然你拒絕這樣做。

單元格僅用於顯示。它們不用於存儲數據。你應該有一個數據模型,每個人都可以訪問。cellForRowAtIndexPath 從該數據模型中讀取。然後,如果發生了改變數據模型的事情(例如通過單擊單元格中的按鈕),那麼您將更改數據模型,並且數據模型應該告訴所有感興趣的人員模型已經改變。

你在一個視圖中和其他地方的一個UILabel細胞絕對不應該在所有連接。任何更改都應該通過您的數據模型傳播。

+0

我沒有想過用一個類來存儲數據,接下來的幾分鐘,我不認爲爲什麼它是一個乾淨的模型! 明天我會試試這個,因爲我住的地方很晚,並且讓你知道。謝謝 ! – Synny

+0

所以,我已經建立了我的數據模型與射線wenderlich政黨成員的幫助下(https://www.raywenderlich.com/1797/ios-tutorial-how-to-create-a-simple-iphone-app-part-1 )。我已經設置了一個包含我的標題的Doc和Data類。 我已經成功創建了我的TableViewCellDoc項目,但是當我將它發送到cellForRowAtIndexPath到我的單元格對象時,我在標籤內沒有任何內容。查看我用來發送它的代碼:TableViewCellDoc * item = [self.itemArray objectAtIndex:indexPath.row]; TableViewCell * cellItem = [[TableViewCell alloc] init]; cellItem.itemName.text = item.data.title; – Synny

+0

嗡嗡聲我發現了這個問題,它來自cellForRowAtIndexPath中的單元格的初始化。我曾經這樣做,像UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:@「cardCell」];而不是TableViewCell(我的自定義類如此)** cell = [tableView dequeueReusableCellWithIdentifier:@「cardCell」] ;.我現在可以通過代理方法打印所有項目,謝謝:) – Synny

2

您沒有使用myItemcellForRowAtIndexPath:你隨時隨地細胞似乎越來越從其他一些方法自己的文字,當他們應該從celForRowAtIndexPath:

+0

請看看我編輯的問題,我已經添加了我使用從我的其他類 – Synny

+0

@Synny檢索myItem串的方法,你別說你還沒有發佈的'awakeFromNib'方法。 – Gavin

+0

@Synny,你的'+(的NSString *)getItemName'方法是一個類方法,所以它裏面的'myItem'只有一個實例,並很可能被許多不同的細胞進行訪問。相反,使用'cellForRowAtIndexPath'內的'[self.itemArray objectAtIndex:row]'設置文本。如果需要,可以將其轉發給其他實例方法。但是你不應該爲這樣的事情使用類方法。 – Hash88