0

我已经观看了 Apple 的 WWDC 2021 视频,该视频介绍了如何编写具有自定义组活动的 iOS 应用程序,链接在这里

观看此视频后,我尝试使用 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()
    }
}

你可以在这里下载:

ShareOrder 应用程序

我的问题如下:

  1. 由于我使用的是 UIKit 和 SwiftUI,所以我不能使用.task修饰符。所以我创建了一个异步任务viewDidLoad()来配置组活动会话。这是正确的做事方式,还是有更好的方法?
  2. 我需要测试的是让两台设备运行 iOS 15 b4 并安装相同的应用程序,或者一台运行 MacOS 12 b4 的 Mac 和一台运行 iOS 15 b4 的 iOS 设备,对吗?
4

1 回答 1

0

已经测试了我的应用程序并且它有效!

  1. 不知道这是否仍然是最好的解决方案,但是在 viewDidLoad() 中创建一个异步任务确实对我有用。
  2. 是的。我在运行 macOS 12 b4 的 Intel Mac 和运行 iOS 15 b4 的 iPhone SE 上测试了我的应用程序。
于 2021-08-06T07:53:28.467 回答