iOS共享扩展名configurationItems(tableView)

时间:2019-05-09 11:16:25

标签: ios swift tableview ios-extensions

请和我一起来吧,我是Swift和iOS的新手。

我正在尝试在我的共享扩展名上进行“团队选择”。理想情况下,我希望能够点击“团队”页脚并从表格视图中选择多个团队,最后共享/发布到所选团队。

enter image description here

我一直在关注2016年的教程,但不幸的是,我认为它已经过时了,而且我还找不到最新的类似教程。 (如果您知道,请链接)

我用硬编码的teamList创建了一个TeamTableViewController.swift(UITableViewController),我希望将其填充到共享扩展名中。

我的UITableViewController文件如下:

import UIKit

protocol TeamViewProtocol {
  func sendingViewController(viewController: TeamTableViewController, sentItem: String)
}

class TeamTableViewController: UITableViewController {

  var teamList: [String] = ["Team 1", "Team 2", "Team 3", "Team 4", "Team 5"]
  var delegate: TeamViewProtocol?

    override func viewDidLoad() {
        super.viewDidLoad()

        self.clearsSelectionOnViewWillAppear = false
    }

    // MARK: - Table view data source

    override func numberOfSections(in tableView: UITableView) -> Int {
        // #warning Incomplete implementation, return the number of sections
      return 1
    }

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        // #warning Incomplete implementation, return the number of rows
        return self.teamList.count
    }

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "TeamCell", for: indexPath) 

        cell.textLabel!.text = self.teamList[indexPath.item]

        return cell
    }

}

我的ShareViewController文件管理器如下所示:

import UIKit
import Social

class ShareViewController: SLComposeServiceViewController, TeamViewProtocol {

  var item: SLComposeSheetConfigurationItem!
  var teamPickerVC: TeamTableViewController!

    override func isContentValid() -> Bool {
        // Do validation of contentText and/or NSExtensionContext attachments here
        return true
    }

    override func didSelectPost() {
        // This is called after the user selects Post. Do the upload of contentText and/or NSExtensionContext attachments.

        // Inform the host that we're done, so it un-blocks its UI. Note: Alternatively you could call super's -didSelectPost, which will similarly complete the extension context.
        self.extensionContext!.completeRequest(returningItems: [], completionHandler: nil)
    }

  override func configurationItems() -> [Any]! {
    self.item = SLComposeSheetConfigurationItem()

    self.item.title = "Team"
    self.item.value = "None"

    self.item.tapHandler = {
      self.teamPickerVC = TeamTableViewController()
      self.pushConfigurationViewController(self.teamPickerVC)
    }

    return [self.item]
  }

  func sendingViewController(viewController: TeamTableViewController, sentItem: String) {
    self.item.value = sentItem
    self.popConfigurationViewController()
  }

}

当我点击扩展窗口页脚“ Team”时,整个扩展都关闭,没有错误消息。但是,如果我将硬编码的teamList数组设置为一个空数组,那么扩展名不会崩溃/关闭,而是显示具有空行的表视图。

为了使我的硬编码团队显示为单元格/行/行,我缺少什么?在表格视图中?

3 个答案:

答案 0 :(得分:1)

您应该返回适​​当的节数或可以删除​​该方法,因此它将numerOfSections的默认值设为1

override func numberOfSections(in tableView: UITableView) -> Int {
    // #warning Incomplete implementation, return the number of sections
  return 1
}

希望有帮助

答案 1 :(得分:0)

经过反复试验。我终于在论坛上找到了有关tableView函数正确实现的论坛帖子,其中调用了参数cellForRowAt

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
  var cell = tableView.dequeueReusableCell(withIdentifier: "TeamCell")

  if cell == nil {
    cell = UITableViewCell(style: .default, reuseIdentifier: "TeamCell")
  }

  cell!.textLabel!.text = self.teamList[indexPath.item]
  return cell!
}

这不容易调试,并且没有打印错误或异常。

答案 2 :(得分:0)

您还必须为tableView实现didSelectRowAt委托,以便能够将所选项目发送回主视图。

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    let selectedItem = self.teamList[indexPath.item]
    delegate?.sendingViewController(viewController: self, sentItem: selectedItem)
    self.navigationController?.popViewController(animated: true)
}