iOS 分享扩展,配置项(tableView)
iOS share extension, configurationItems (tableView)
请恕我直言,我对 swift 和 iOS..
完全陌生
我正在尝试在我的共享扩展上创建 "team select"。理想情况下,我希望能够从 table 视图点击 "Team" 页脚和 select 多个团队,最后 share/post 进入 selected 团队。
我一直在关注 2016 年的教程,但不幸的是,我认为它现在已经过时了,而且我找不到类似的最新教程。 (如果你知道请link)
我创建了一个 TeamTableViewController.swift
(UITableViewController),其中包含一个硬编码的 teamList,我希望将其填充到共享扩展中。
我的 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()
}
}
当我点击扩展程序 window 页脚 "Team" 时,整个扩展程序都会关闭,没有任何错误消息。但是,如果我将硬编码的 teamList 数组设置为空数组,则扩展不会 crash/dismiss 而是显示 table 具有空行的视图。
为了让我的硬编码团队显示为 cell/lines/rows,我缺少什么?在 table 视图中?
您应该 return 适当的节数或者可以删除该方法,因此它会将 numerOfSections
的默认值设为 1
override func numberOfSections(in tableView: UITableView) -> Int {
// #warning Incomplete implementation, return the number of sections
return 1
}
希望对您有所帮助
经过大量的反复试验。我终于找到了一个论坛 post,它介绍了使用参数 cellForRowAt
调用的 tableView 函数的正确实现
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!
}
这不容易调试,并且没有打印错误或异常。
您还必须为 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)
}
请恕我直言,我对 swift 和 iOS..
完全陌生我正在尝试在我的共享扩展上创建 "team select"。理想情况下,我希望能够从 table 视图点击 "Team" 页脚和 select 多个团队,最后 share/post 进入 selected 团队。
我一直在关注 2016 年的教程,但不幸的是,我认为它现在已经过时了,而且我找不到类似的最新教程。 (如果你知道请link)
我创建了一个 TeamTableViewController.swift
(UITableViewController),其中包含一个硬编码的 teamList,我希望将其填充到共享扩展中。
我的 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()
}
}
当我点击扩展程序 window 页脚 "Team" 时,整个扩展程序都会关闭,没有任何错误消息。但是,如果我将硬编码的 teamList 数组设置为空数组,则扩展不会 crash/dismiss 而是显示 table 具有空行的视图。
为了让我的硬编码团队显示为 cell/lines/rows,我缺少什么?在 table 视图中?
您应该 return 适当的节数或者可以删除该方法,因此它会将 numerOfSections
的默认值设为 1
override func numberOfSections(in tableView: UITableView) -> Int {
// #warning Incomplete implementation, return the number of sections
return 1
}
希望对您有所帮助
经过大量的反复试验。我终于找到了一个论坛 post,它介绍了使用参数 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!
}
这不容易调试,并且没有打印错误或异常。
您还必须为 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)
}