2017-02-16 63 views
0

我目前正在學習如何以編程方式完全構建應用程序,並在過程中遇到了一些問題。使用Swift在TableView中迭代UITextViews使用Swift

我的應用程序將會是一個非常簡單的表單,用戶可以填寫它,並且會在包含信息的末尾生成PDF。對於基本信息,我有一個包含一組UITextfields的tableview,並且沒有任何問題通過它們迭代並將數據提取到一個字符串數組中。 對於下一節,用戶需要輸入更多的文本,所以我在tableview中使用了UITextviews。我想要做的是提取輸入的文本並將其保存到用於創建我的客戶對象的字符串數組中。執行此代碼如下:

func createGoals() { 
    for section in 0..<secondTableView.numberOfSections { 

     for row in 0..<secondTableView.numberOfRows(inSection: section) { 

      let indexPath = NSIndexPath(row: row, section: section) 
      let thisCell = secondTableView.cellForRow(at: indexPath as IndexPath) as! mySecondCell 
       if thisCell.textview.text == "Enter Goals" { 
       print("NO CONTENT IN FIELD") 
       let ac = UIAlertController(title: "But...But...", message: "If you have no goals, how can you progress?!", preferredStyle: .alert) 
       ac.addAction(UIAlertAction(title: "OK", style: .default)) 
       present(ac, animated: true) 
       break 
       } else { 
        print("I MADE IT") 
        print("\(thisCell.textview.text!)") 
        newClient.goalArray.append(thisCell.textview.text) 
        print(newClient.goalArray) 
        } 
     } 
    } 

} 

但是,當它運行我得到錯誤信息「意外發現零,同時展開一個可選值」,並特別強調了這一行:

let thisCell = secondTableView.cellForRow(at: indexPath as IndexPath) as! mySecondCell 

這代碼與我如何成功遍歷UITextfields幾乎完全相同,所有變化都是附加的變量,並且據我所見,沒有可選項。 另外,如果我沒有填寫UITextviews,它將顯示UIAlertController,它只是在我刪除佔位符並填寫UITextviews時似乎有問題。 有沒有人有任何想法,爲什麼發生這種情況?如果需要,我可以提供更多的代碼。

+0

調試器告訴你,secondTableView在你傳遞的行中不包含任何單元格。驗證secondTableView的行數應該有所幫助。 – ystack

+0

我剛剛在調試器中嘗試過,並且它正在按照預期在部分0中返回4行。行肯定存在,那麼我的for循環可能會錯過一個? – EtherCode

+0

mySecondCell似乎是一個實例,而不是一個類。您需要將單元格作爲類類型即。 let thisCell = secondTableView.cellForRow(at:indexPath as IndexPath)as! MyCellSubclass'或甚至更好的使用警衛'警衛let thisCell = secondTableView.cellForRow(在:indexPath作爲IndexPath)? mySecondCell else {return}' –

回答

0

這是您的選購

as! mySecondCell 

顯然,thisCell不是mySecondCell

檢查,如果你沒有註冊正確類

編輯

你不應該自己撥打代理方式

+0

哦,我沒有意識到,仍然算作可選,我認爲強迫downcasts是不同的。以下是我如何註冊它,我很確定它是正確的? 在VDL: 'secondTableView.delegate =自 secondTableView.dataSource =自 secondTableView.register(mySecondCell.self,forCellReuseIdentifier: 「secondCellID」)', 同樣在cellForRow: 「如果的tableView ==自.secondTableView讓bCell = secondTableView.dequeueReusableCell(withIdentifier:「secondCellID」,for:indexPath)as! mySecondCell', 這是註冊正確的方法嗎? – EtherCode

+0

你可能是對的。我沒有注意你在哪裏使用這段代碼。您應該閱讀Kalpesh jetani的答案。他是對的,你不能自己調用​​委託方法 – Acrasia

0

在這裏您正在加載單元格迭代。所以問題是由於您要加載/訪問不可見的單元格造成的。

這裏你不應該加載cellForRowAtIndexPath的cell側。

原因:UITableView正在重複使用帶有可重複使用的CellIdentifier的單元。

這裏您需要在textfield-didEndEditing調用(textfield委託方法)時將值保存在數組或字典中。 和驗證檢查您可以使用從數組/字典中保存的值。

+0

好吧,我會嘗試這種方式,看看。 只是出於興趣是否有任何理由加載迭代中的單元格時,完美迭代通過textFields但不使用textViews時? – EtherCode

+0

如果它使用textFields,那麼它應該在textViews不起作用時使用。 如果你迭代tableview.visiblecells你不會得到上述問題。但在這裏你的任務並不完整。所以爲了從textviews/Textfields獲得修改後的值,您需要將其保存在didEndEditing上。 還有問題,請檢查類別/擴展或超類。 –