我一直在寻找不同的解决方案,我不断看到的解决方案是将滚动边缘外观设置为等于标准外观。我也看过这个解决方案。这两种解决方案都不适合我。一旦用户到达可滚动内容的末尾(我认为滚动边缘就是这样),我也没有看到此问题出现。我发现当用户开始在长列表中滚动时就会出现问题。我在下面附上了照片,其中机密数据已被模糊处理。我的应用程序中导航栏看起来正确的唯一位置是在主视图中。我的应用程序架构是主要细节。它在 iOS 14 的所有导航栏中都能完美运行,此问题特定于 iOS 15。
场景 1:主视图控制器列表视图(滚动开始后导航栏看起来正确)
场景 2:在 MVC 表格上选择一个项目后(导航栏是透明的,滚动开始后不会模糊)
这是我在故事板中的当前视图,其中包含标准边缘和滚动边缘的默认值。

除了将滚动边缘外观设置为等于标准之外,我还尝试过一些方法:
我有一个我想重用的函数,并让它接受一个Decocable结构的参数.例如,这是我当前代码的简化(假设"MyDecodableStruct"是在应用程序的其他地方声明的可解码结构):
static func getResults(url: String, parameters: Parameters) {
// On success REST response
if response.result.isSuccess {
struct Results: Decodable {
let items: [MyDecodableStruct]
}
if let jsonResults = try? JSONDecoder().decode(Results.self, from: response.data!) {
//success
}
}
Run Code Online (Sandbox Code Playgroud)
而不是说"MyDecodableStruct",我希望它是我作为参数传递的任何Decodable结构.像这样的东西:
static func getResults(url: String, parameters: Parameters, myStruct: Decodable) {
// On success REST response
if response.result.isSuccess {
struct Results: Decodable {
let items: [myStruct]
}
if let jsonResults = try? JSONDecoder().decode(Results.self, from: response.data!) {
//success
}
}
Run Code Online (Sandbox Code Playgroud)
我会称之为
getResults(url: "url", parameters: nil, myStruct: …Run Code Online (Sandbox Code Playgroud) Swift 4.2 引入了一个新的removeAll {where:} 函数。根据我的阅读,它应该比使用过滤器 {where:} 更有效。我的代码中有几个场景,如下所示:
private func getListOfNullDates(list: [MyObject]) -> [MyObject] {
return list.filter{ $0.date == nil }
.sorted { $0.account?.name < $1.account?.name }
}
Run Code Online (Sandbox Code Playgroud)
但是,我不能将 removeAll{where:} 与参数一起使用,因为它是一个常量。所以我需要像这样重新定义它:
private func getListOfNullDates(list: [MyObject]) -> [MyObject] {
var list = list
list.removeAll { $0.date == nil }
return list.sorted { $0.account?.name < $1.account?.name }
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下使用 removeAll 函数是否仍然更有效?还是坚持使用过滤功能更好?
我想写一个可以接受任何Alamofire DataResponse值的方法.例如,我可能会传入DataResponse<Any>或DataResponse<String>.然而,我无法找到让它工作的方法.例如,如果我尝试使用像这样的"DataResonse"
static func isTimeout(response: DataResponse) -> Bool {
if let error = response.result.error {
if error._code == NSURLErrorTimedOut {
return true
}
}
return false
}
Run Code Online (Sandbox Code Playgroud)
我收到编译错误:
Reference to generic type 'DataResponse' requires arguments in <...>
Insert <Any>.
Run Code Online (Sandbox Code Playgroud)
但是,如果我更改参数类型DataResponse<Any>,它将无法正常工作DataResponse<String>.我尝试传递DataResponse<String>给函数时得到的编译错误是:
Cannot convert value of type 'DataResponse<String>' to expected argument type 'DataResponse<Any>'
Run Code Online (Sandbox Code Playgroud)
我也试过DataResponse<AnyObject>并得到与上面相同的错误DataResponse<Value>并得到了这个错误:
Use of undeclared type 'Value'
Run Code Online (Sandbox Code Playgroud)
有关如何执行此操作的任何想法,所以我不必仅为略有不同的参数类型复制函数?
我正在使用 SplitViewController 并且在详细信息页面(设置为“定义上下文”)上,用户可以在导航栏中选择“+”,然后我使用 segue 呈现下一个视图控制器“在当前上下文上模态”。在那个视图控制器上,我使用 Eureka,我想使用的行之一是 PushRow。我遇到的问题是,当我在 PushRow 上选择一个选项时,视图(选择 Eureka 生成的选项表)永远不会关闭。选项列表保持全屏。我可以看到 PushRow.onChange 被调用并且它具有正确的值。由于某种原因,最上面的视图不会关闭。
我挖得更深,似乎我需要将 PushRow 的presentationMode 修改为“presentModally”,因为我是从模态中呈现它的。但是,我不确定要为 controllerProvider 放置什么。这是正确的道路吗?如果是这样,正确的语法是什么?我还尝试在 onChange 中重新加载,但这并没有什么不同。
private func getGroupPushRow() -> PushRow<String> {
return PushRow<String>() {
$0.title = "Group"
$0.selectorTitle = "What is the Group?"
$0.noValueDisplayText = "Select a Group..."
$0.options = self.getGroups()
$0.presentationMode = PresentationMode.presentModally(controllerProvider: ControllerProvider<VCType>, onDismiss: { () in
})
$0.onChange({ (row) in
print("in onchange \(row.value)")
// row.reload()
// self.tableView.reloadData()
})
}
}
Run Code Online (Sandbox Code Playgroud)