Swift,XCode 6,为现有的uitableview添加了新的部分

时间:2015-08-31 08:19:46

标签: ios xcode swift uitableview xcode6

我有一个视图,其中顶部有一个按钮,右下方有一个桌面视图。我默认显示一个部分。我想要实现的是,当单击按钮时,我想在默认部分下方添加一个全新的部分。我想在按下按钮时在现有部分下面添加新部分。

点击按钮之前:

按钮

 <UITableView>
     Default Section Header
       Row 1
       Row 2
       Row 3
</UITableView>

按下按钮

按钮

<UITableView>
  Default Section Header
   Row 1
   Row 2
   Row 3

  Newly added section header
   Row 1
   Row 2
   Row 3
   Row 4
</UITableView>

我搜索了很多,但我只找到了Objective-C引用。

我知道我需要使用以下功能:

insertRowsAtIndexPathsinsertSections

但我真的无法理解如何使用Swift。我是iOS开发的新手。

请帮帮我。提前谢谢!

2 个答案:

答案 0 :(得分:0)

  

我只是给你一些代码。用作参考。

class MyInfoView: UIView, UITableViewDataSource, UITableViewDelegate {

@IBOutlet weak var myInfoTableView: UITableView!

var headerNamesArray: [String]?//= ["Personal Details", "Contact Details","Emergency Contacts", "Dependents", "Immigration", "Job", "Salary", "Report-to", "Qualifications", "Memberships"]
var cellDetailsArray:NSDictionary?
var currentExpandedIndex:Int = -1
var isButtonTapped:Bool = false

//MARK:- Register Tableview Method -
func registerTableView()
{
    println(self.frame)
    myInfoTableView.frame = CGRectMake(0.0, 0.0, CGRectGetWidth(self.frame), CGRectGetHeight(self.frame) - 64)
    myInfoTableView.registerNib(UINib(nibName: "CustomTableViewCell", bundle: nil), forCellReuseIdentifier: "InfoCellID")
    loadTableViewDetails()
}
//MARK:- Loading details from Plist -
func loadTableViewDetails()
{
    cellDetailsArray = NSDictionary(contentsOfFile: NSBundle.mainBundle().pathForResource("TextFieldNames", ofType: "plist")!)
    headerNamesArray = cellDetailsArray!.allKeys as? [String]
    println(cellDetailsArray)
}
//MARK:- tableview header button Action -
func headerButtonTapped(sender: AnyObject)
{
    isButtonTapped = !isButtonTapped

    var anIndex:NSInteger = sender.tag
    var indexSet:NSMutableIndexSet = NSMutableIndexSet(index: anIndex)

    if anIndex == currentExpandedIndex {
        //            myInfoTableView.deleteRowsAtIndexPaths( (currentExpandedIndex, withRowAnimation: UITableViewRowAnimation.Right);
        currentExpandedIndex = -1
    } else if (currentExpandedIndex != -1 ) {
        indexSet.addIndex(currentExpandedIndex)
        currentExpandedIndex =  anIndex
        isButtonTapped = true
    } else {
        currentExpandedIndex = anIndex
    }
    println(indexSet)
    myInfoTableView.reloadSections(indexSet ,withRowAnimation:UITableViewRowAnimation.Middle)
}
}
  //MARK:- TableView Delegate and DataSource Methods -
 extension MyInfoView: UITableViewDataSource, UITableViewDelegate {

func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    return headerNamesArray!.count
}

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    cellDetailsArray![headerNamesArray![section]];
    return cellDetailsArray![headerNamesArray![section]]!.count;
}

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("InfoCellID", forIndexPath: indexPath) as! CustomTableViewCell
    var headerSection = indexPath.section
    cell.userTextField.placeholder = cellDetailsArray![headerNamesArray![headerSection]]![indexPath.row] as? String

    return cell
}

func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
    if isButtonTapped && currentExpandedIndex == indexPath.section {
        return 40.0
    }
    else {
        return 0.0
    }
}
func tableView(tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
    return 0.5
}

func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    let headerView = NSBundle.mainBundle().loadNibNamed("TableHeaderView", owner: self, options: nil) [0] as! TableHeaderView
    headerView.headerButton.setTitle(headerNamesArray![section], forState: .Normal)
    headerView.applyViewStyle()
    headerView.headerButton.tag = section
    headerView.headerButton.addTarget(self, action: Selector("headerButtonTapped:"), forControlEvents:.TouchUpInside)
    headerView.arrowImageView.image = UIImage(named: "sidearrow.png")
    if currentExpandedIndex == section {
        headerView.arrowImageView.image = UIImage(named: "downarrow.png")
    }
    return headerView
}
func tableView(tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    return 40.0
}
func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool {
    return true
}
func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {

}
}

答案 1 :(得分:0)

否你不需要插入任何东西。只需更新要显示的数据的变量,然后重新加载tableview。

e.g。在 Swift 3

cert, err := generate(opts)

return func(clientHello *tls.ClientHelloInfo) (*tls.Certificate, error) {
        if err != nil {
            return nil, err
        }
        return cert, err
    }

然后你可以这样做来更新tableview:

class TableViewController: UITableViewController {

var sections = ["pizza", "deep dish pizza"]

var items = [["Margarita", "BBQ Chicken", "Pepperoni"], ["sausage", "meat lovers", "veggie lovers"]]

func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
    return sections[section]
}

func numberOfSections(in tableView: UITableView) -> Int {
    return sections.count
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return items[section].count
}

免责声明:如果您使用的是Xcode 6,您可能正在使用Swift 2.2,但功能显然相似,前提保持不变。