swift - 在 TableViewController 中选择行时的 SIGABRT

标签 swift tableview cells sigabrt

我有一个问题:
当我选择 tableView 的第二个单元格时,我得到一个 SIGABRT。但是当我选择第一个时,一切正常。

它一定与我的 TableViewController 类有关,因为当我选择第二个单元格时,“SET ROWS IN SECTION”(来 self 的 print 语句)将打印 3 次,但当我选择第一个单元格时,将打印 3 * 4 = 12 次...
哦...我收到此错误:

GONNA SET THE ROWS IN SECTION
2
SET SECTION 2 TO 1
GONNA SET THE ROWS IN SECTION
0
SET SECTION 0 TO 1
GONNA SET THE ROWS IN SECTION
1
SET SECTION 1 TO 3
2016-07-04 12:43:14.407 Sessions[1229:629535] *** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayI objectAtIndex:]: index 2 beyond bounds [0 .. 1]'
*** First throw call stack:
(0x1822e6db0 0x18194bf80 0x1821c7098 0x187b7d5ac 0x187933f1c 0x18756d444 0x18752aff8 0x1878e4b88 0x187529fc4 0x187529d5c 0x187529b68 0x187794a20 0x18752fac8 0x18743fac8 0x187465350 0x18743ed40 0x182c18cc0 0x18743ebc4 0x18744c678 0x18763edbc 0x18743fac8 0x18743f7ac 0x18743ed40 0x182c18cc0 0x18743ebc4 0x18744c678 0x1876df8c0 0x1874535b4 0x18763e8d4 0x18775e334 0x18763e44c 0x1875f8818 0x187503e40 0x187503b1c 0x187503a84 0x1874401e4 0x184dd2994 0x184dcd5d0 0x184dcd490 0x184dccac0 0x184dcc820 0x1874365f8 0x18229c728 0x18229a4cc 0x18229a8fc 0x1821c4c50 0x183aac088 0x1874ae088 0x1000f8b54 0x181d628b8)
libc++abi.dylib: terminating with uncaught exception of type NSException

“SET SECTION 2 TO 1”表示第 2 部分有 1 个单元格...
这是我的类(class):

import UIKit

class SessionsTableViewController: UITableViewController {

    let header = ["Mediatoren", "Medianden", "Konfliktverlauf"]
    var medianden: Array<String> = []
    var mediators: Array<String> = []

//  ----------------
//  MARK : IBACTIONS
//  ----------------

    (I just deleted these...)

//  ---------------------
//  MARK : OVERRIDE FUNCS
//  ---------------------

    override func viewDidLoad() {super.viewDidLoad() }
    override func didReceiveMemoryWarning(){ super.didReceiveMemoryWarning()}
    override func viewWillAppear(animated: Bool) {
        print(sessions.workingOnSession)
        medianden.append((sessions.workingOnSession["Name1"] as? String)!)
        medianden.append((sessions.workingOnSession["Name2"] as? String)!)
        medianden.append((sessions.workingOnSession["Name3"] as? String)!)
        medianden.append((sessions.workingOnSession["Name4"] as? String)!)
        //print(medianden)
        for _ in 0...3 {
            if medianden.last == "" {
                medianden.removeLast()
            }
        }
        print(medianden)
        mediators.append((sessions.workingOnSession["MID"] as? String)!)
        mediators.append((sessions.workingOnSession["MID2"] as? String)!)
        //print(mediators)
        for _ in 0...1 {
            if mediators.last == "" {
                mediators.removeLast()
            }
        }
        print(mediators)
    }

//  ---------------------
//  MARK : FUNCS
//  ---------------------

    (Deleted these too...)

//  -----------------
//  MARK : TABLE VIEW
//  -----------------

    override func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
        return self.header[section]
    }
    override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        return 3
    }
    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        print("SET ROWS IN SECTION")
        print(section)
        if section == 0 {
            print("SET SECTION 0 TO \(mediators.count)")
            return mediators.count
        } else if section == 1 {
            print("SET SECTION 1 TO \(medianden.count)")
            return medianden.count
        } else if section == 2 {
            print("SET SECTION 2 TO 1")
            return 1
        }
        return 0
    }
    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

        print("MAKE MY CELLS...")
        let cell = UITableViewCell()
        if indexPath.section == 0 {
            cell.detailTextLabel?.text = mediators[indexPath.row]
            return cell
        } else if indexPath.section == 1 {
            cell.textLabel!.text = medianden[indexPath.row]
            return cell
        } else if indexPath.section == 2 {
            let textCell = FSTextViewTableViewCell()
            return textCell
            //textCell.textView.text = sessions.workingOnSession["Description"] as? String
        }
        return cell
    }
}

谢谢大家!!! :-) 抱歉我的英语不好...
法比安

最佳答案

错误信息非常清楚。

uncaught exception 'NSRangeException',
reason: '*** -[__NSArrayI objectAtIndex:]: index 2 beyond bounds [0 .. 1]'

因此,您有一个包含元素 [0..1] 的数组,并且您正在访问元素 [2]。您的程序中只有这么多数组:mediatorsmediandenself.header。尝试进行更多调试,看看哪一个出了问题。

您似乎假设 mediators 有 2 个元素,mediaden 有 4 个元素,这是硬编码的。最好不要在整个代码中散布这些依赖关系;相反,设置一次大小,并使代码的其余部分独立于大小(使用 for 循环等)工作。

关于swift - 在 TableViewController 中选择行时的 SIGABRT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38185295/

相关文章:

ios - 查询 Firebase 问题 - Swift

ios - swift ios 使用大小类肖像模式检查 iphone 5 或 iphone 6

swift - 如何反复更新 UILabel 并控制其变化速度?

ios - Pod 无法在 iPhone 上运行

vba - 为什么 Range 有效,而 Cells 无效?

javafx - startEdit 或 setOnEditCommit 都没有被调用

java - 如何将CellValueFactory设置为javafx中各种属性的函数?

ios - 如何使用带有数组 (Dictionary<String, [String]>) 的快速字典中的定义来显示在表格 View 单元格上?

excel - 删除单元格的一部分