Post

Replies

Boosts

Views

Activity

Settings bundle for DEXT loading app does not display content.
I have an app that loads a DEXT (driver). This app includes a settings bundle that allows me to activate/deactivate the driver. When I issue the API call to activate the driver, iOS switches to the Settings app and displays the page for my DEXT loading application but the switch to enable the driver, which is part of my settings bundle, does not appear. I'm using this API call: OSSystemExtensionRequest.activationRequest(forExtensionWithIdentifier: "driver-id", queue: .main) Here are the contents of my settings bundle Root.plist: ` Here are the contents of my Root.strings file: "Group" = "Group"; "Name" = "Name"; "none given" = "none given"; "Enabled" = "Enabled";
2
0
928
Mar ’24
Unable to link to or even find USBDriverKit for iPadOS
According to Apple's documentation USBDriverKit for iPadOS has been available since DriverKit 19 and the M1 iPad were released. However, using Xcode 15.0.1, I am unable to link to or even find USBDriverKit from within Xcode. Is the documentation incorrect? If not what do I need to do in order to access and leverage USBDriverKit? From what I've read, USBSerialDriverKit is not available. As I have a USB based serial device that I want to use from the iPad, the next obvious step is to write my own USB device extension using USBDriverKit as a provider. If you have experience with this and can definitively say whether or not what I'm attempting is even within the realm of possibility, please chime in. Thanks. -Michael
2
0
1.3k
Dec ’23
How to I cancel a task created by the new Swift `async` keyword and closure, after the fact?
I'm experimenting with async/await on some existing code and would like to cancel an async thumbnail download if the table-view cell needs to be re-used. The problem is that I don't know how to declare storage for the handle so I can cancel it later on. See the attached code. class PhotoCell: UITableViewCell {     @IBOutlet weak var albumLabel: UILabel!     @IBOutlet weak var photoIdLabel: UILabel!     @IBOutlet weak var thumbnailImageView: UIImageView!     @IBOutlet weak var titleLabel: UILabel!     private static var imageLoader = ImageLoader() //    private var task: Handle<(), Never>?     override func prepareForReuse() { //        task?.cancel()         albumLabel.text = ""         titleLabel.text = ""         photoIdLabel.text = ""     }     // MARK: - Public Methods     func configure(with photo: JPPhoto) {         albumLabel.text = "#\(photo.albumId.rawValue)"         titleLabel.text = photo.title photoIdLabel.text = "#\(photo.id.rawValue)"         thumbnailImageView.image = UIImage(systemName: "photo")         /* task = */async {             if let image = await PhotoCell.imageLoader.loadImage(from: photo.thumbnailUrl) {                 thumbnailImageView.image = image             }         }     } }
4
0
1.5k
Jun ’21
TableView inside of a CollectionView cell does not draw on row deletion.
Ok, the setup for this is pretty complex. I'm doing maintenance on an app I did not write. The view structure is as follows: At the base you have a UICollectionViewController. Each UICollectionViewCell has an assigned UIViewController within it. Each of these controllers is attached to the view hierarchy as a child view controller. The main view of one of these child controllers is a UITableView/UIViewController pair. Everything seems to be hooked up properly and working well except for one case. Assuming the table-view has more than two rows, If I swipe-left to delete the second row (IndexPath 0,1), the content or row one (IndexPath 0,0) goes blank. I can see the disclosure accessory view but the two UILabels up and disappear. If I tap on the blank row the tap behavior is still intact. If I refresh the table-view, the missing content appears as it should. To make things a little more interesting, this table-view is implement using RxSwift. Here is the code: private func bind() {         // Cell for row at index path.         let curriedArgument: (Int, Assignment, AssessmentTableViewCell) - Void = { /* rowIndex */_, model, cell in             cell.assignment = model         }         let observer: Observable[Assignment]         // For the widget version of this controller, only display the first N         // items in a table-view that does not scroll. If more than N items exist         // the user must tap the `More` view. For the non-widget view, show all         // available items in a scrolling table-view.         if isWidget {             tableView.isScrollEnabled = false             observer = viewModel                 .assignments                 .asObservable()                 .map({ Array($0.prefix(CPAssignmentWidgetVC.numberOfItemsToDisplay))})         } else {             observer = viewModel                 .assignments                 .asObservable()         }         observer             .distinctUntilChanged()             .bind(to: tableView.rx.items(cellIdentifier: "AssessmentCell"), curriedArgument: curriedArgument)             .disposed(by: disposeBag)         // When something changes, update both the widget and the modal view as         // needed.         if isWidget {             Observable                 .combineLatest(viewModel.fetching.asObservable(),                                viewModel.assignments.asObservable())                 .subscribe(onNext: { [weak self] (isFetching, assignments) in                     self?.updateFooter(with: assignments, isFetching: isFetching)                 })                 .disposed(by: disposeBag)         } else {             viewModel.fetching.asObservable()                 .distinctUntilChanged()                 .debounce(.milliseconds(500), scheduler: MainScheduler.instance)                 .subscribe(onNext: { isFetching in                     if isFetching {                         SVProgressHUD.show()                     } else {                         SVProgressHUD.dismiss()                     }                 })                 .disposed(by: disposeBag)         }         // Select cell         tableView             .rx             .itemSelected             .subscribe(onNext: { [unowned self] indexPath in                 self.tableView.deselectRow(at: indexPath, animated: true)                 guard                     let cell = tableView.cellForRow(at: indexPath) as? AssessmentTableViewCell,                     let assignment = cell.assignment else { return }                 if cell.assignmentResult != nil {                     presentOptions(cell)                 } else {                     guard let patient = patient, patient.hasPermissionToModify(permissionType: .assessments) else {                         let title = NSLocalizedString("We're sorry!", comment: "Notification error title")                         let message = NSLocalizedString("You don't have permission to complete this survey", comment: "Notification error message")                         let dismiss = NSLocalizedString("Dismiss", comment: "Button title")                         LHDNotification.show(with: title, text: message, type: .error).setDismissButtonTitle(dismiss)                         return                     }                     presentAssignmentEntryForm(assignment)                 }             })             .disposed(by: disposeBag)         // Delete cell (remove associated backing model value)         tableView             .rx             .itemDeleted             .subscribe(onNext: { indexPath in                 self.viewModel.remove(at: indexPath.row)             })             .disposed(by: disposeBag)         // Display last cell         tableView             .rx             .willDisplayCell             .subscribe(onNext: { [unowned self] (/* cell */_, indexPath) in                 if indexPath.item + 1 == self.viewModel.numberOfItems {                     self.viewModel.loadMore()                 }             })             .disposed(by: disposeBag)     } } Question: Why is the first row content being wiped out? Assuming no one can know the answer to this I have a follow-up question. How can I get the contents of the entire tableview to redraw themselves after a successful delete? I would have assumed the binding to the table-view on line 27 would handle this automatically when the view-model updates.
Topic: UI Frameworks SubTopic: UIKit Tags:
3
0
1.2k
Jun ’21