如何编写包含 GroupActivities 框架的 UIKit 应用程序
How to write a UIKit app incorporating the GroupActivities framework
我观看了 Apple 的 WWDC 2021 视频,介绍了如何编写具有自定义群组活动的 iOS 应用,link here。
观看此视频后,我尝试使用 UIKit 而不是 SwiftUI 编写自己的简单应用程序。这是一个简单的应用程序,它使用 UIAlert 将字符串添加到 UITableView。我在 macOS Monterey beta 4 上使用 Xcode 13 beta 4 运行 编写了它。它似乎在我的 MacBook 上运行良好,但我没有设备 运行 iOS 15 beta 4 进行测试,在模拟器中无法运行。希望尽快测试。
与此同时,我想我应该分享代码。这是一个简单的应用程序,只有一个视图控制器,下面是其中的代码:
//
// ViewController.swift
// ShareOrder
//
// Created by iOS 15 Programming on 28/07/2021.
//
import UIKit
import GroupActivities
class ViewController: UIViewController {
var orders: [String] = []
var groupSession: GroupSession<ShareOrder>?
var messenger: GroupSessionMessenger?
@IBOutlet var tableView: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
title = "ShareOrder"
tableView.register(UITableViewCell.self, forCellReuseIdentifier: "orderCell")
Task {
for await session in ShareOrder.sessions(){
configureGroupSession(session)
}
}
}
@IBAction func activateGroupActivity(_ sender: Any) {
ShareOrder().activate()
}
@IBAction func addOrder(_ sender: UIBarButtonItem) {
let alert = UIAlertController(title: "New Order", message: "Add a new order", preferredStyle: .alert)
let saveAction = UIAlertAction(title: "Save", style: .default) {
[unowned self] action in
guard let textField = alert.textFields?.first, let orderToSave = textField.text else {
return
}
self.orders.append(orderToSave)
if let messenger = messenger {
Task {
do {
try await messenger.send(orderToSave)
} catch {
print("Failed to send")
}
}
}
self.tableView.reloadData()
}
let cancelAction = UIAlertAction(title: "Cancel", style: .cancel)
alert.addTextField()
alert.addAction(saveAction)
alert.addAction(cancelAction)
present(alert, animated: true)
}
}
extension ViewController: UITableViewDataSource {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
orders.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "orderCell", for: indexPath)
cell.textLabel?.text = orders[indexPath.row]
return cell
}
}
extension ViewController {
struct ShareOrder: GroupActivity {
var metadata: GroupActivityMetadata {
var metadata = GroupActivityMetadata()
metadata.title = NSLocalizedString("Share Order", comment: "Title of group activity")
metadata.type = .generic
return metadata
}
}
func configureGroupSession(_ groupSession: GroupSession<ShareOrder>) {
orders.removeAll()
self.groupSession = groupSession
let messenger = GroupSessionMessenger(session: groupSession)
self.messenger = messenger
Task.detached { [weak self] in
for await (message, _) in messenger.messages(of: String.self) {
await self?.handle(message)
}
}
groupSession.join()
}
func handle(_ message: String) {
self.orders.append(message)
self.tableView.reloadData()
}
}
您可以在这里下载:
我的问题如下:
- 由于我使用的是 UIKit 和 SwiftUI,因此无法使用
.task
修饰符。所以我在 viewDidLoad()
中创建了一个异步任务来配置组 activity 会话。这是做事的正确方法,还是有更好的方法?
- 我需要测试的是两台设备 运行 iOS 15 b4 安装了相同的应用程序,或者一台 Mac 运行 Mac OS 12 b4 和一个 iOS 设备 运行 iOS 15 b4,正确吗?
已测试我的应用程序,它可以正常工作!
- 不知道这是否仍然是最佳解决方案,但在 viewDidLoad() 中创建异步任务对我来说确实有效。
- 是的。我在 Intel Mac 运行 macOS 12 b4 和 iPhone SE 运行 iOS 15 b4.
上测试了我的应用程序
我观看了 Apple 的 WWDC 2021 视频,介绍了如何编写具有自定义群组活动的 iOS 应用,link here。
观看此视频后,我尝试使用 UIKit 而不是 SwiftUI 编写自己的简单应用程序。这是一个简单的应用程序,它使用 UIAlert 将字符串添加到 UITableView。我在 macOS Monterey beta 4 上使用 Xcode 13 beta 4 运行 编写了它。它似乎在我的 MacBook 上运行良好,但我没有设备 运行 iOS 15 beta 4 进行测试,在模拟器中无法运行。希望尽快测试。
与此同时,我想我应该分享代码。这是一个简单的应用程序,只有一个视图控制器,下面是其中的代码:
//
// ViewController.swift
// ShareOrder
//
// Created by iOS 15 Programming on 28/07/2021.
//
import UIKit
import GroupActivities
class ViewController: UIViewController {
var orders: [String] = []
var groupSession: GroupSession<ShareOrder>?
var messenger: GroupSessionMessenger?
@IBOutlet var tableView: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
title = "ShareOrder"
tableView.register(UITableViewCell.self, forCellReuseIdentifier: "orderCell")
Task {
for await session in ShareOrder.sessions(){
configureGroupSession(session)
}
}
}
@IBAction func activateGroupActivity(_ sender: Any) {
ShareOrder().activate()
}
@IBAction func addOrder(_ sender: UIBarButtonItem) {
let alert = UIAlertController(title: "New Order", message: "Add a new order", preferredStyle: .alert)
let saveAction = UIAlertAction(title: "Save", style: .default) {
[unowned self] action in
guard let textField = alert.textFields?.first, let orderToSave = textField.text else {
return
}
self.orders.append(orderToSave)
if let messenger = messenger {
Task {
do {
try await messenger.send(orderToSave)
} catch {
print("Failed to send")
}
}
}
self.tableView.reloadData()
}
let cancelAction = UIAlertAction(title: "Cancel", style: .cancel)
alert.addTextField()
alert.addAction(saveAction)
alert.addAction(cancelAction)
present(alert, animated: true)
}
}
extension ViewController: UITableViewDataSource {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
orders.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "orderCell", for: indexPath)
cell.textLabel?.text = orders[indexPath.row]
return cell
}
}
extension ViewController {
struct ShareOrder: GroupActivity {
var metadata: GroupActivityMetadata {
var metadata = GroupActivityMetadata()
metadata.title = NSLocalizedString("Share Order", comment: "Title of group activity")
metadata.type = .generic
return metadata
}
}
func configureGroupSession(_ groupSession: GroupSession<ShareOrder>) {
orders.removeAll()
self.groupSession = groupSession
let messenger = GroupSessionMessenger(session: groupSession)
self.messenger = messenger
Task.detached { [weak self] in
for await (message, _) in messenger.messages(of: String.self) {
await self?.handle(message)
}
}
groupSession.join()
}
func handle(_ message: String) {
self.orders.append(message)
self.tableView.reloadData()
}
}
您可以在这里下载:
我的问题如下:
- 由于我使用的是 UIKit 和 SwiftUI,因此无法使用
.task
修饰符。所以我在viewDidLoad()
中创建了一个异步任务来配置组 activity 会话。这是做事的正确方法,还是有更好的方法? - 我需要测试的是两台设备 运行 iOS 15 b4 安装了相同的应用程序,或者一台 Mac 运行 Mac OS 12 b4 和一个 iOS 设备 运行 iOS 15 b4,正确吗?
已测试我的应用程序,它可以正常工作!
- 不知道这是否仍然是最佳解决方案,但在 viewDidLoad() 中创建异步任务对我来说确实有效。
- 是的。我在 Intel Mac 运行 macOS 12 b4 和 iPhone SE 运行 iOS 15 b4. 上测试了我的应用程序