我有一个 TabView 和每个 Tab 项的单独 NavigationView 堆栈。它运行良好,但是当我打开任何 NavigationLink 时,仍会显示 TabView 栏。我希望它在我点击任何 NavigationLink 时消失。
struct MainView: View {
@State private var tabSelection = 0
var body: some View {
TabView(selection: $tabSelection) {
FirstView()
.tabItem {
Text("1")
}
.tag(0)
SecondView()
.tabItem {
Text("2")
}
.tag(1)
}
}
}
struct FirstView: View {
var body: some View {
NavigationView {
NavigationLink(destination: FirstChildView()) { // How can I open FirstViewChild with the TabView bar hidden?
Text("Go to...")
}
.navigationBarTitle("FirstTitle", displayMode: .inline)
}
}
} …Run Code Online (Sandbox Code Playgroud) 我有一个List包含TextEditor
struct ContentView: View {
@State var text: String = "test"
var body: some View {
List((1...10), id: \.self) { _ in
TextEditor(text: $text)
}
}
}
Run Code Online (Sandbox Code Playgroud)
但它的项目并没有随着TextEditor. 我试过.fixedSize()修饰符但没有运气。我在这里缺少什么?
我找不到在 Widget 中实现某种 ProgressBar 的解决方案。我明白了,例如,如果类型为 .timer,则应该更改 Text 组件。我看到默认的小部件时钟,带有漂亮的移动箭头动画。但是我可以在小部件中实现自定义动画吗?
我正在HealthKit我的小部件中使用数据。如果手机被锁定,则无法获取HealthKit数据,除非手机解锁。但是,即使手机被锁定,我的小部件时间线也会尝试更新。
是否有可能以某种方式返回空完成,因此它将保持当前小部件数据不变?
这是我的代码:
struct Provider: IntentTimelineProvider {
private let healthKitService = HealthKitService()
func getTimeline(for configuration: ConfigurationIntent, in context: Context, completion: @escaping (Timeline<Entry>) -> ()) {
let currentDate = Date()
let refreshDate = Calendar.current.date(byAdding: .minute, value: 5, to: currentDate)!
healthKitService.getHeartRate() { data, error in
//Create an empty entry
var entry = SimpleEntry(date: currentDate, configuration: ConfigurationIntent(), data: nil)
//If no errors, set data
if(error == nil) {
entry.data = data
} else {
print(error) //this runs when a …Run Code Online (Sandbox Code Playgroud) 控制台错误: SwiftUI 在推送导航链接时遇到问题。请提交错误。
NavigationLink 中不使用 isActive 参数是没有问题的。但是,我必须使用 isActive 参数。因为我相应地关闭了下拉列表。
菜单型号:
struct Menu: Identifiable {
var id: Int
var pageName: String
var icon: String
var page: Any
var startDelay: Double
var endDelay: Double
// var offsetY: CGFloat
}
let menu = [
Menu(id: 1, pageName: "Profil", icon: "person.crop.circle", page: ProfileView(), startDelay: 0.2, endDelay: 0.6),
Menu(id: 2, pageName: "Sepet", icon: "cart", page: CartView(), startDelay: 0.4, endDelay: 0.4),
Menu(id: 3, pageName: "?stek", icon: "plus.circle", page: ClaimView(), startDelay: 0.6, endDelay: 0.2)
]
Run Code Online (Sandbox Code Playgroud)
菜单视图
struct …Run Code Online (Sandbox Code Playgroud) 我正在 swiftui 中创建一个小部件,其中包含预填充的模拟 json,存储在本地。
模拟 JSON 有以下数据:
{
"id":"111",
"title":"some dummy title",
"date":"1609865285",
"thumbnail":"mock4"
}
Run Code Online (Sandbox Code Playgroud)
并且mock4图像存储在Assets文件夹中。
我在时间线方法中加载模拟数据,如下所示:
for mockItem in storyManager.getMockData() {
let item = WidgetFeedItem(newsData: mockItem)
items.append(item)
}
let entry = FeedItemEntry(date: Date(), items: entries)
if let nextDate = Calendar.current.date(byAdding: .minute, value: 15, to: Date()) {
let timeline = Timeline(entries: [entry], policy: .after(nextDate))
completion(timeline)
}
struct WidgetFeedItem: Hashable {
var newsTitle = ""
var newsDate = Date()
var newsID = ""
var newsimageURL = ""
var articleLink = "" …Run Code Online (Sandbox Code Playgroud) 所以我知道以下代码有效:
struct ContentView: View {
func removeRows(at offsets: IndexSet) {
numbers.remove(atOffsets: offsets)
}
@State private var numbers = [Int]()
@State private var currentNumber = 1
var body: some View {
VStack {
List {
ForEach(numbers, id: \.self) {
Text("\($0)")
}
.onDelete(perform: removeRows)
}
Button("Add Number") {
self.numbers.append(self.currentNumber)
self.currentNumber += 1
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
我不明白的是removeRows(at offsets: IndexSet)自定义函数处理程序是如何.onDelete()工作的。at具体来说,为什么前面有一个参数标签offsets:。您可以使用on代替at例如吗?参数标签只是为了让我们更好地理解代码吗?
然后,IndexSet我认为我将其理解为一种类型,它保存用于索引目的的 Int 或用于删除列表中的行的 Int 范围,以便 swiftui 知道要删除哪一行?
我想我理解numbers.remove(atOffsets: …
我试图在一个简单的测验(例如示例)中将逻辑与用户界面分开。但当我回答完问题后,我正在努力思考如何离开。
在 Xcode 12 中我收到错误:
访问安装在视图之外的状态值。这将导致 Binding 的初始值恒定并且不会更新。
我从其他答案中看到@State只能在struct中使用,建议发布。但我似乎无法弄清楚如何使用已发布的属性与其绑定而不是“安装在视图上”
class ViewModel: ObservableObject {
@Published var currentQuestion: String!
private var questions = ["one", "two", "three"]
private var index = 0
init() {
currentQuestion = questions[index]
}
func button(title: String) -> some View {
Button(action: { [self] in
if index < questions.count {
index += 1
currentQuestion = questions[index]
} else {
print("go to results view")
}
}) {
Text(title)
}
}
}
struct ContentView: View {
@ObservedObject var viewModel = ViewModel() …Run Code Online (Sandbox Code Playgroud) 我正在为 ios 14 Home Widget 开发一个应用程序,在显示当前时间(数字时钟)时遇到一个问题,即该小部件没有每秒更新。众所周知,苹果不允许每秒触发时间线,有没有其他方法可以实时更新显示当前时间?
我尝试了这些方法,但没有按预期工作
class NetworkManager: ObservableObject {
@Published var dateIs = Date()
init() {
startTimer() // fetch data must be called at least once
}
private func startTimer() {
let t = RepeatingTimer(timeInterval: 3)
t.eventHandler = {
DispatchQueue.main.async() {
// your UI update code
print("Timer Fired")
self.dateIs = Date()
WidgetCenter.shared.reloadAllTimelines() // reload timelines
}
if(false){ //I know this makes no sense, but it works. Go figure...
t.suspend()
}
}
t.resume()
}
}
struct Provider: TimelineProvider { …Run Code Online (Sandbox Code Playgroud) 我尝试创建一个自定义 SwiftUI 菜单(基于UIMenu)。
但是,我无法触发主要操作。
当我点击时它会起作用CustomMenu,但不会触发程序操作。我究竟做错了什么?
struct CustomMenu: UIViewRepresentable {
let title: String
@Binding var isPresented: Bool
func makeUIView(context: Context) -> UIButton {
let button = UIButton(type: .system)
button.setTitle(title, for: .normal)
button.menu = UIMenu(title: "", options: .displayInline, children: [
UIAction(title: "Item 1", image: UIImage(systemName: "mic"), handler: { _ in }),
UIAction(title: "Item 2", image: UIImage(systemName: "envelope"), handler: { _ in }),
UIAction(title: "Item 3", image: UIImage(systemName: "flame.fill"), handler: { _ in }),
UIAction(title: "Item 4", …Run Code Online (Sandbox Code Playgroud)