使用 iOS 模拟器时,我只需删除该应用程序并重新运行该应用程序即可重新开始。对于 macOS 应用程序,这是如何完成的?我找不到它。“DerivedData”内有一个项目文件夹,但删除它也会扰乱整个项目,我必须重新获取所有依赖项和内容。
谢谢!
我正在尝试为我实现拖放UICollectionViews(我也想了解UICollectionViewLayouts).我实现了dragDelegate/dropDelegate集合视图的方法,现在我可以拖动单元格了.
我还设置了drop的意图.insertAtDestinationIndexPath,以便单元格移动到拖动单元格的位置(因此当将拖动的单元格悬停在其上时,布局会发生变化).
这与之完美配合UICollectionViewFlowLayout.但是,我正在使用IGListKit它基本上为集合视图中的每个单元格使用一个部分.部分通常总是在新行上渲染,但我希望在同一行上有多个部分(=单元格).这就是我将布局子类化的原因:
class CustomFlowLayout: UICollectionViewFlowLayout {
override var collectionViewContentSize: CGSize {
return CGSize(width: contentWidth, height: contentHeight)
}
fileprivate var contentHeight: CGFloat = 0
fileprivate var contentWidth: CGFloat {
guard let collectionView = collectionView else {
return 0
}
let insets = collectionView.contentInset
return collectionView.bounds.width - (insets.left + insets.right)
}
var cachedAttribtues = [UICollectionViewLayoutAttributes]()
override func prepare() {
super.prepare()
cachedAttribtues = []
guard let collectionView = collectionView else …Run Code Online (Sandbox Code Playgroud) drag-and-drop ios uicollectionview uicollectionviewlayout swift
我已经使用UICollectionView自定义UICollectionViewCell并UIContentConfiguration使用新的iOS 14API 实现了一个列表。我一直在关注本教程:https://swiftsenpai.com/development/uicollectionview-list-custom-cell/(以及Apple的示例项目)
基本上你现在有 a UICollectionViewCell、 aUIContentConfiguration和 a UIContentView。仅仅cell设置其配置,content configuration保存单元的数据及其所有可能的状态,并且是替换 的content view实际值。UIViewUICollectionViewCell.contentView
我已经让它工作了,它非常棒而且干净。但有一点我不明白:
您如何向UIContentView或 中添加回调以将单元格中所做的更改(例如UISwitch切换或更改)传达到?和 单元格之间的唯一连接位于创建 的数据源时的单元格注册内部:UITextFieldviewControllerviewControllercollectionView
// Cell
class Cell: UICollectionViewListCell {
var event: Event?
var onEventDidChange: ((_ event: Event) -> Void)?
//...
}
// Example cell registration in ViewController
let eventCellRegistration = UICollectionView.CellRegistration<Event.Cell, Event> { [weak self] (cell, …Run Code Online (Sandbox Code Playgroud) @State并且@Binding在SwiftUI.
struct ColorView: View {
@Binding public var isBlue: Bool
var body: some View {
Rectangle()
.foregroundColor(isBlue ? .blue : .red)
.onTapGesture {
self.isBlue.toggle()
}
}
}
struct TestView: View {
@State var isBlue: Bool = false
var body: some View {
ColorView(isBlue: $isBlue)
}
}
Run Code Online (Sandbox Code Playgroud)
它可以毫无问题地工作,而且非常简单。但是MVVM说你应该把所有的视图数据放在一个视图模型类中,以将 UI 与模型分开。但你失去了@State和@Binding彻底。您似乎失去了这种 2 向绑定。当然,您可以使用Combine或其他方式手动完成,但这不应该是正确的方法,对吗?
每当我尝试任何事情时,SwiftUI当您不使用视图模型时,这真的很容易和方便。然而,一旦你把所有东西都放在一个视图模型类中,一切都会崩溃,没有什么比这更方便的了。这不可能,他们早就想到了。所以我在这里遗漏了一些东西。我真的很感激任何帮助。您将如何使用视图模型对上述示例进行编码(无需手动“破解”任何内容)?我试过了,但它甚至没有编译:
struct ColorView: View {
@ObservedObject var viewModel: ViewModel
class ViewModel: ObservableObject …Run Code Online (Sandbox Code Playgroud) 我真的很想避免使用它NSManagedObjectID作为将我的模型结构连接到其 CoreData 对象的方式。我的意思是这样的:
假设我Book在 CoreData 中有一个实体,然后我有一个像这样的模型结构,代表我的模型层:
struct BookModel {
let name: String
...
let objectID: NSManagedObjectID // I need this to refer back to the entry in the database
}
Run Code Online (Sandbox Code Playgroud)
我不喜欢这种方法。它使得使用结构变得乏味,例如,测试很烦人,因为我总是必须生成虚拟 objectId 或使其成为BookModel.objectID可选。
我想要的是实体内部id的类型属性。这将很容易连接到结构,并且还允许结构在没有数据库的情况下正确存在:UUIDBook
struct BookModel {
let name: String
...
let id: UUID
...
func object() -> Book {
// Retrieve managed object using a fetch request with a predicate.
}
}
Run Code Online (Sandbox Code Playgroud)
我注意到您实际上可以UUID在实体中拥有属性。然而,性能差异似乎是巨大的。我创建了一个尝试获取单个对象 10000 次的示例。
首先,我使用context …
我正在使用 newUICollectionViewListCell和UIContentConfigurations,它们非常棒,但我不知道如何更改UIKit自动为这些单元格设置的默认单元格高度 44。这是一个示例单元格:
class TextFieldCell: UICollectionViewListCell {
struct ContentConfiguration: UIContentConfiguration, Hashable {
struct Handlers: ContentConfigurationHandlers {
var onTextChanged: ((_ newText: String) -> Void)?
}
var handlers: Handlers?
var text: String?
var placeholder: String?
var keyboardType: UIKeyboardType?
func makeContentView() -> UIView & UIContentView {
ContentView(configuration: self)
}
func updated(for state: UIConfigurationState) -> TextFieldCell.ContentConfiguration {
guard let state = state as? UICellConfigurationState else { return self }
var updatedConfiguration = self
return updatedConfiguration
}
}
class …Run Code Online (Sandbox Code Playgroud) 我有很多关于onClick-Events的页面(每个页面都有自己的onClick-Event的其他元素).所有页面都包含在一个主页面中(index.php)
因此,我无法将所有jQuery onClick-Events放在页面的头部(因为<head>它只是在index.php,而不是在包含的页面中)
现在更好的是<script>...</script>在我包含的每个页面中制作一个吗?因为这不会在<head>.
或者我应该使用HTML-attribute onClick=""?
如果您有一个集合视图并且您通过插入几个来更改项目,则默认布局会同时淡出它们.是否有可能一个接一个地淡化它们?
我在考虑子类化UICollectionViewLayout,但我不确定这是否会像那样工作.
我是否真的必须添加逻辑,以便不会同时发生多个插入?(这样我插入一个项目,等一下,插入第二个项目,...手动完成)必须有更好的方法.我希望
谢谢你的帮助
(有关更多信息,请参阅更新 3。我修复了原始问题,现在出现了一个我以前从未见过的异常)
所以我一直在尝试实现我自己版本的 IOS11 的拖放功能。我已经实现了一个自定义的gesture recognizer和我自己的拖放会话管理器,称为DragAndDropSession.
我的应用程序的情况如下:我有一个“全屏”垂直滚动collectionView,它collectionView在每个单元格(行)中保持水平滚动。例如,有点像 netflix 所拥有的。
在拖动项目时,我希望这些水平collectionViews 为拖动的项目动态腾出空间(就像 IOS11 的拖放一样)。我通过向行添加一个不可见的单元格collectionView然后collectionView.beginInteractiveMovement(..)在该单元格上使用来做到这一点。这样,当我不断将其更新到当前触摸位置时,它看起来像是在移动间隙。(我还没有找到更好的方法)。
每次触摸移动到不同的行时,我停止第一个interactive movement,删除空单元格,并将其添加到新的collectionView,在那里我再次开始interactive movement. 这里的困难在于管理方面,以便一切都得到“清理”,然后重新正确设置。
由于这很难解释,我创建了一个演示项目来展示所有内容(包括我稍后将要告诉您的崩溃):
https://github.com/d3mueller/DragAndDropTest (我希望它能正常工作。如果没有,请告诉我)
一些东西:
IGListKit(https://github.com/Instagram/IGListKit)来管理我的collectionViews. 不过,这可能与我的问题无关。(我试图评论重要的部分)...SectionController. 这是 collectionView (IGListKit) 中单元格的“管理器”。例如,垂直滚动中的collectionView每一行都有一个部分控制器,其中包含该行的数据,以及该行的 collectionView 等。好的,现在我的问题是:它崩溃了。有时。它给了我这个错误信息:
'NSInternalInconsistencyException',原因:'尝试在重新排序过程中开始重新排序集合视图'
我设置了一个断点来捕获这个异常,所以我知道它在 中崩溃了DragAndDropSession.swift: Line 194,这是这样的:
rowCollectionView.beginInteractiveMovementForItem(at: rowIndexPath)
Run Code Online (Sandbox Code Playgroud)
在这一行中,我为手指当前悬停的 collectionView 行开始了一个新的交互式移动。我只是不知道为什么它会走到这条线,因为它已经开始了互动运动。上面几行(第 171 行)我取消了交互动作。
有一个特定的案例/情况我没有在我的代码中涵盖/捕捉。我就是找不到。我在这上面花了几个小时。 …
我希望这不会被视为重复。有一个关于为您的应用程序使用多个包标识符的问题:https : //stackoverflow.com/a/20151432/3134192
已接受答案中的链接准确地解释了我想要做什么。我想要 3 个不同的包标识符:beta、debug、app store。我想这样命名它们:
App Store: {currentIdentifier}
Beta: {currentIdentifier}.beta
Debug: {currentIdentifier}.debug
Run Code Online (Sandbox Code Playgroud)
但是,我已经将我的应用程序上传到了,App Store Connect并且已经提交了一个用于 beta 测试的构建TestFlight({currentIdentifier}用作包标识符)。我现在不知道怎么改。有没有办法告诉 App Store Connect 我想对 TestFlight 使用 beta 标识符,而对 App Store 版本使用另一个标识符?
我唯一的猜测是:
我必须为 beta 包标识符创建另一个分发配置文件,在 App Store Connect 中创建一个新的 AppID 和一个新的应用程序条目。然后我会有两个版本的应用程序,旧版本(带有当前有效的 beta 测试和包标识符“ {currentIdentifier}”)和新版本(带有包标识符“{currentIdentifier}.beta ”)。然后我只需要在测试版上启动任何新的测试版,并在另一个上启动任何应用商店版本。
这样对吗?当我尝试为同一个应用程序创建多个 AppID 等时,恐怕我会破坏某些东西。