2016-07-31 34 views
2

我有一個名爲TableViewController的視圖控制器和另一個名爲feed.swift的自定義單元格單元格被正確地重用,因爲我不想知道什麼按鈕被按下。 在我cellForRowAtIndexPath我填充我的用戶名與我分析過的JSON。它看起來像這樣Swift:如何從一個UIViewController訪問一個可變的字符串數組到一個TableView單元格文件

cell.username.text = username[indexPath.row]  
output-> ["andre gomes", "renato sanchez", "renato sanchez"] 

然後我已標記了用戶名按鈕,這樣

cell.usernamePress.tag = indexPath.row 

在我feed.swift我檢查,如果一個按鈕這是怎麼回事,我TableViewController按下並打印出分配給該按鈕的標籤

@IBAction func usernameBut(sender: AnyObject) { 
    print(usernamePress.tag) 
} 
output-> 2 

現在我需要訪問feed.swift中的TableViewController的用戶名數組,並做一些像用戶名[usernamePress.tag]

我試圖做一個global.swift文件,但我不能配置它的字符串數組。

import Foundation 

class Main { 
var name:String 
init(name:String) { 
    self.name = name 
    }  
} 
var mainInstance = Main(name: "hello") 

即使這樣做後,我試着打印mainInstance.name,即使改變它也返回hello。我想要一個解決方案,其中字符串數組保存我在TableViewController中設置的值,並且我可以在feed.swift中使用它們。 歡迎任何建議!我很抱歉,如果有這方面的任何類似的問題,但我無法弄清楚如何使用它的字符串

回答

1

我建議你不要直接在你的FeedCell中使用數組,而是將新聞事件返回到你處理事件的TableViewController。根據Apple要求您使用的MVC方案(結賬Apples documentation),您的所有數據操作都應在控制器中進行,然後使用該數據準備視圖。這不是負責顯示正確值的視圖。

爲了解決您的問題,我會選擇通過委託模式傳回新聞事件,例如,您創建一個FeedCellDelegate協議,定義一個函數時,按下該按鈕被稱爲:

protocol FeedCellDelegate { 
    func feedCell(didPressButton button: UIButton, inCell cell: FeedCell) 
} 

裏面你FeedCell你再添加一個委託屬性,它被告知通過查看事件:

class FeedCell { 
    var delegate: FeedCellDelegate? 
    ... 
    @IBAction func pressedUsernameButton(sender: UIButton) { 
     delegate?.feedCell(didPressButton: sender, inCell: self) 
    } 
} 

如果您TableViewController則符合剛纔定義的協議(實現在沒有定義的方法),你指定的ViewController作爲視圖的代表,您可以處理邏輯控制器:

class TableViewController: UITableViewController, FeedCellDelegate { 
    ... 
    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
     let cell = tableView.dequeueReusableCellWithIdentifier("FeedCell", forIndexPath: indexPath) as! FeedCell 
     cell.delegate = self 
     // Further setup 
     return cell 
    } 

    func feedCell(didPressButton button: UIButton, inCell cell: FeedCell) { 
     guard let indexPath = tableView.indexPathForCell(cell) else { return } 

     // Do your event-handling 
     switch (button.tag) { 
     case 2: print("Is username button") 
     default: print("Press not handled") 
     } 
    } 
} 

正如你可能認識到我改變了你的班級名稱。 A 飼料聽起來更像模型級,而FeedCell暗示其顯示數據的作用。如果你爲自己的類和變量選擇了自解釋的名字,那麼這會讓程序員的生活方式變得更加簡單,所以你可以自由地適應它。 :)

+0

在聲明委託的時候用到了UsernameButton動作,我得到了1.在調用和2中使用了無關的參數標籤didPressUsernameButtonInCell。代碼看起來像這個委託?.feedCell(self),但是當我點擊它時,它給了我它沒有 –

+0

對不起,我沒有編譯代碼,並在那裏犯了兩個錯誤。我更新了答案,它現在應該工作。 –

+1

謝謝你尼克指出我在協議和代表的方向。他們肯定是要走的路:) –

0

的可變數組,你應該弱陣列屬性添加到tableViewCell:

弱var userNameArray:[String]?

然後在你的tableViewController的用戶名數組傳遞進入細胞:

有趣的tableView(的tableView:UITableView的,的cellForRowAtIndexPath indexPath:NSIndexPath) - > {UITableViewCell的

//創建單元格,然後...

if let array = self.username { 
    cell.userNameArray = array 
} 

}

然後你可以使用在細胞本身的數組來填充其字段處理按鈕水龍頭,等c。

+0

你不能將weak應用於一個數組(字符串)。數組是一個結構權? –

相關問題