首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

尝试读取UIKit的UIDevice方向时,SwiftUI onAppear无法正常工作

在SwiftUI中,onAppear是一个视图修饰符,用于在视图出现时执行特定的操作。然而,当尝试读取UIKit的UIDevice方向时,onAppear可能无法正常工作。这是因为SwiftUI和UIKit之间的交互存在一些限制和不兼容性。

在SwiftUI中,我们可以使用EnvironmentObject或ObservableObject来管理应用程序的状态和数据。而UIDevice是UIKit中的一个类,用于获取设备的相关信息,例如设备的方向。

要在SwiftUI中获取设备方向,可以使用@EnvironmentObject或@ObservableObject来创建一个自定义的设备方向管理类。首先,创建一个名为DeviceOrientationManager的类,实现ObservableObject协议:

代码语言:txt
复制
import SwiftUI
import Combine

class DeviceOrientationManager: ObservableObject {
    @Published var orientation: UIDeviceOrientation = UIDevice.current.orientation
    
    init() {
        UIDevice.current.beginGeneratingDeviceOrientationNotifications()
        NotificationCenter.default.addObserver(self, selector: #selector(deviceOrientationDidChange), name: UIDevice.orientationDidChangeNotification, object: nil)
    }
    
    deinit {
        UIDevice.current.endGeneratingDeviceOrientationNotifications()
        NotificationCenter.default.removeObserver(self)
    }
    
    @objc private func deviceOrientationDidChange() {
        DispatchQueue.main.async {
            self.orientation = UIDevice.current.orientation
        }
    }
}

然后,在你的视图中使用@EnvironmentObject或@ObservedObject来观察设备方向的变化,并在onAppear中执行相应的操作。例如,假设你有一个名为ContentView的主视图:

代码语言:txt
复制
import SwiftUI

struct ContentView: View {
    @EnvironmentObject var deviceOrientationManager: DeviceOrientationManager
    
    var body: some View {
        VStack {
            Text("Device Orientation: \(deviceOrientationManager.orientation.rawValue)")
        }
        .onAppear {
            // 在这里执行你的操作
            print("View appeared")
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
            .environmentObject(DeviceOrientationManager())
    }
}

在这个例子中,我们创建了一个名为deviceOrientationManager的EnvironmentObject,并将其注入到ContentView中。然后,在视图的body中,我们显示了设备的方向。在onAppear闭包中,你可以执行你想要的操作,例如根据设备方向调整视图布局或执行其他逻辑。

这是一个基本的示例,你可以根据实际需求进行扩展和定制。同时,你可以使用腾讯云的相关产品来支持你的云计算需求,例如腾讯云移动开发平台(https://cloud.tencent.com/product/mwp)和腾讯云云原生应用引擎(https://cloud.tencent.com/product/nae)等。

请注意,由于限制和不兼容性,本示例中没有提及亚马逊AWS、Azure、阿里云、华为云、天翼云、GoDaddy、Namecheap、Google等流行的云计算品牌商。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Ask Apple 2022 与 SwiftUI 有关问答(上)

是否可以在纯 SwiftUI 中完成( 不使用 UIKit )?给我一些方向来完成它吗?A:一般来说,我建议使用 .safeAreaInset(edge: .bottom) 来实现底部文本字段。...最近,我注意到 SwiftUI 视图 onAppear 在意想不到时间启动,比如当 UITabBarController 被创建,而不是当视图本身出现时。...开发者目前仍在尝试创建一个可优雅地同时为两种模式提供路径模型。阅读 SwiftUI 4.0 全新导航系统[13] ,了解它们之间不同。...使用它们应该只创建一个实例,然后可以在子视图中读取。这应该不会增加内存使用( 如果有的话,请提出反馈 )。如果你向你模型对象追加越来越多数据,你可能会增加内存使用,这是很正常。...} }}LabeledContentQ:Label 有时被( 误 )用来为一个值提供文字说明( 例如,账户余额为 10 美元 ),但一些开发人员没有意识到这个说明在 VoiceOver 中无法读取

12.2K20

SwiftUI 视图生命周期研究

SwiftUI 视图生命周期研究 访问我博客 www.fatbobman.com[1] ,获得更好阅读体验 在 UIKit(AppKit)世界中,通过框架提供大量钩子(例如 viewDidLoad...在进行更详尽说明之前,请大家先明确两个观点: •SwiftUI 没有同 UIkit(AppKit)对应视图与视图生命周期•应避免对 SwiftUI 视图创建、body 调用、布局与渲染等时机和频率进行假设...•在 SwiftUI 生成视图值树,当发现没有对应实例SwiftUI 会创建一个实例从而获取它 body 结果。...body 值是在主线程上进行,并且 SwiftUI 必须在一个渲染周期内完成所有的计算、比较、布局等工作。...,将完成依赖项建立工作•在视图生命周期中,只有一个依赖项副本•在视图生命周期中,无论创建多少个实例,同一间只有一个实例可以连接到依赖项•依赖项为视图 Source of truth 了解 SwiftUI

4.4K30
  • onAppear 调用时机

    onAppear( task )是 SwiftUI 开发者经常使用一个修饰符,但一直没有权威文档明确它闭包被调用时机。...这会让开发者误以为 onAppear 是在视图渲染后( 使用者看到后 )才被调用。但在 SwiftUI 中,onAppear 实际上是在渲染前被调用。...在写 SwiftUI 视图生命周期研究 一文,我们只能通过现象来推断 onAppear 调用时机,随着版本不断提高,SwiftUI 4 中为我们提供了足够工具让我们可以获得更加确实证据。...viewWillAppear 则是在 UIViewController 被呈现前( 可以理解为渲染前 ),会由 UIKit 调用。...,此时 newWords 已经有值了,ForEach 将正常处理所有的子视图总结在本文中,我们通过 SwiftUI 4 提供新工具明确了 onAppear 调用时机,或许这是新 API 开发未曾想到功能应用

    2.1K20

    SwiftUI中使用UIKit视图

    ,但仍有大量事情是无法直接通过原生SwiftUI代码来完成。...比如onAppear同viewWillAppear表现很类似。同UIKit钩子方法位置有很大不同, onAppear和onDisappear是在当前视图父视图上声明。...将UIKit视图包装成SwiftUI视图,我们需要了解两者生命周期之间不同,不要强行试图找到完全对应方法,要从SwiftUI角度来思考如何调用UIKit视图。...通常需要开发者在UIViewRepresentable视图Coordinator(协调器)中做一些工作,从而保证两个框架(SwiftUIUIKit)代码之间沟通和联系。...Introspect通过自省方法来尝试查找原生控件背后包装UIKit(或AppKit)组件。目前官方尚未在SwiftUI中开放功能多数可以通过此扩展库提供方法来解决。

    8.2K22

    老人新兵 —— 一款 iOS APP 开发手记

    ,直到后来由于功能需要在 SwiftUI 下混合使用 UIKit 开发才真正体会到了声明式优势。...有以下几个难点:SwiftUI 功能十分有限在真正要实现诸多功能发现,目前很多场景下仍然要通过 UIKit 才能完成,为此又耗费了些心力学习了点 UIKit 内容( 至少需要掌握两者之间如何混合使用...在最后 app 里面有接近一半显示控制其实都是在 UIKit 下完成,即使像 TextField 这样最基本需求,SwiftUI 原生版本有时都无法胜任。...同样代码,有时可以正常编译,有时不能。同样 Form 代码,有时在 Sheet 中可以正常编译,移出 Sheet 又编译错误,有时反之。...其他以后有时间再写虽然目前仍有很多不足,但 SwiftUI + Combine 方向绝对正确,即使在当下也可以带来很大效率提升。再过 2—3 年,相信能有非常大提高。

    2.5K40

    掌握 SwiftUI task 修饰器

    详情请参阅 SwiftUI 视图生命周期研究[3] 一文中有关 onAppear 和 onDisappear 章节SwiftUI 为了判断视图状态是否发生了改变,它会在视图存续期内,反复地生成视图类型实例以达成此目的...Swift 采用是协作式任务取消机制,也就是说,SwiftUI无法直接停止掉我们通过 task 修饰器创建异步任务。...当满足了需要停止由 task 修饰器创建异步任务条件SwiftUI 会给该任务发送任务取消信号,任务必须自行响应该信号并停止作业。...作为一个事件源类型 Source of Truth,每当接收到一个新消息,它都会导致 SwiftUI 对视图 body 重新求值。...在了解了两个版本 task 修饰器工作原理和调用机制后,为老版本 SwiftUI 添加 task 修饰器将不再有任何困难。

    2.2K30

    掌握 SwiftUI task 修饰器

    原文发表于我博客 肘子Swift记事本 task vs onAppear SwiftUI 提供了两个版本 task 修饰器,版本一作用和调用时机与 onAppear 十分类似: public func...图片 我们本意是通过按钮来开启和关闭计时器显示以控制任务生命周期( 关闭结束任务 ),但在点击 Hide Timer 按钮后,app 出现了无法响应且控制台仍在持续输出( 不按照原定间隔时间...Swift 采用是协作式任务取消机制,也就是说,SwiftUI无法直接停止掉我们通过 task 修饰器创建异步任务。...作为一个事件源类型 Source of Truth,每当接收到一个新消息,它都会导致 SwiftUI 对视图 body 重新求值。...在了解了两个版本 task 修饰器工作原理和调用机制后,为老版本 SwiftUI 添加 task 修饰器将不再有任何困难。

    3.6K60

    聊一聊可组装框架( TCA )

    你可以在 SwiftUIUIKit,以及其他框架,和任何苹果平台( iOS、macOS、tvOS、和 watchOS )上使用 TCA。...尽管了解 TCA 用法并不需要太多时间,但如果开发者无法真正地掌握其内在组装逻辑,很难写出让人满意代码。...貌似 TCA 为开发者提供了一种从下至上开发途径,但如果没有对完整功能进行良好地构思,到最后会发现无法组装出预想效果。...另外,采用 WithViewStore 关注特定属性机制在内部都是通过 Combine 来进行。当 Reducer 层级较多时,TCA 也需要付出不小成本进行切分和比对工作。...如果你是 SwiftUI 初学者,并且对 Redux 或 Elm 也没有多少了解,可以先尝试使用一些比较轻量级 Redux-like 框架。在对这种开发模式有了一定熟悉后,再学习 TCA 。

    1.8K20

    SwiftUI + Core Data App 内存占用优化之旅

    第一轮优化:对视图 body 值进行优化 在第一轮优化中,我们会首先尝试SwiftUI 角度入手。...当子视图进入惰性容器可视区域SwiftUI 会调用它 onAppear 闭包,子视图退出可视区域,会调用 onDisappear 闭包。...开发者通常会利用这两个调用时机来实现数据准备和善后工作。...尽管我们节省了差不多 70% 内存占用,但仍无法完全满足需求。 第二轮优化:让托管对象回归惰性状态 在第二轮优化中,我们将尝试从 Core Data 中找寻解决之道。...根据上述原理,我们将尝试如下过程: 在 onAppear 闭包中,通过私有上下文创建一个 Picture 对象 将 data 属性数据转换成 Image,并保存在视图中一个 Source of truth

    2.4K40

    SwiftUI + Core Data App 内存占用优化之旅

    下文中,我们将对这段代码进行逐步优化,以达到最终可用程度。 第一轮优化:对视图 body 值进行优化 在第一轮优化中,我们会首先尝试SwiftUI 角度入手。...当子视图进入惰性容器可视区域SwiftUI 会调用它 onAppear 闭包,子视图退出可视区域,会调用 onDisappear 闭包。...开发者通常会利用这两个调用时机来实现数据准备和善后工作。...尽管我们节省了差不多 70% 内存占用,但仍无法完全满足需求。 第二轮优化:让托管对象回归惰性状态 在第二轮优化中,我们将尝试从 Core Data 中找寻解决之道。...根据上述原理,我们将尝试如下过程: 在 onAppear 闭包中,通过私有上下文创建一个 Picture 对象 将 data 属性数据转换成 Image,并保存在视图中一个 Source of truth

    1.3K10

    如何判断 ScrollView、List 是否正在滚动中

    比如在 SwipeCell[3] 中,需要在可滚动组件开始滚动,自动关闭已经打开侧滑菜单。遗憾是,SwiftUI 并没有提供这方面的 API 。...),调用此方法在 SwiftUI 中,很多视图控件是对 UIKit( AppKit )控件二次包装。...目前 SwiftUI 在内部实现上去 UIKit( AppKit )化很明显,比如,本节介绍方法在 SwiftUI 4.0 中已经失效方法二:Runloop我第一次接触 Runloop 是在学习 Combine...模式,因此无法有效地区分滚动是由那个控件造成方法三:PreferenceKey在 SwiftUI 中,子视图可以通过 preference 视图修饰器向其祖先视图传递信息( PreferenceKey...待 SwiftUI 更多底层实现不再依赖 UIKit( AppKit )之时,才会是它 API 爆发期。希望本文能够对你有所帮助。

    3.8K40

    GeometryReader :好东西还是坏东西?

    在非滚动方向上,ScrollView 会向子视图提供该维度上全部可用尺寸。而在滚动方向上,它向子视图提供建议尺寸为 nil。...如果我们仍然使用上文代码中信息获取方式,那么就无法获得变更后信息: .onAppear { width = proxy.size.width } 因此,正确获取信息方式为: .task...一些开发者表示,在屏幕方向发生变化时,无法获取新信息,原因也是如此。task(id:) 同时涵盖了 onAppear 和 onChange 场景,是最可靠数据获取方式。...用 SwiftUI 方式进行布局 由于对 GeometryReader 负面看法,一些开发者会尝试寻找其他方式以避免使用它。...在处理类似需求,我们应优先采用更符合 SwiftUI 思维方式来考虑布局方案,而非依赖某个特定几何数据进行计算。

    58170

    iOS获取和监测设备基本信息——UIDevice使用

    iOS获取和监测设备基本信息——UIDevice使用 //获取当前设备单例 + (UIDevice *)currentDevice; //获取当前设备名称  @property(nonatomic,...获取电量 @property(nonatomic,readonly) float                         batteryLevel NS_AVAILABLE_IOS(3_0); 设备方向枚举如下...//是否触发了距离传感器 @property(nonatomic,readonly)                            BOOL proximityState 相关通知: //设备方向改变发送通知...UIKIT_EXTERN NSString *const UIDeviceOrientationDidChangeNotification; //电池状态改变发送通知 UIKIT_EXTERN NSString... *const UIDeviceBatteryStateDidChangeNotification   NS_AVAILABLE_IOS(3_0); //电量改变发送通知 UIKIT_EXTERN

    61920

    SwiftUI TextField 进阶 —— 事件、焦点、键盘

    onCommit 当用户在输入过程中按下(或点击)return键触发 onCommit(无法通过代码模拟触发)。...即使在onAppear中,也必须要有一定延时才能让 TextField 焦点。...同其他类型 Toolbar 类似,SwiftUI 会干预内容排版。•无法对同一视图中多个 TextField 分别设定辅助视图在 ToolbarItem 中无法使用稍微复杂一点判断语法。...将键盘辅助视图集成到 toolbar 逻辑中也有些令人令人费解。 通过 UIKit 创建 当前阶段,通过 UIKit 来创建键盘辅助视图仍是 SwiftUI最优方案。...相信再有 2-3 年,SwiftUI 主要控件原生功能就可以比肩对应 UIKit 控件了。 关于如何对 TextField 显示做更多定制,之后会撰文探讨。 希望本文对你有所帮助。

    13.2K10

    SwiftUI 与 Core Data —— 数据获取

    本文中我们将探讨在 SwiftUI 视图中批量获取 Core Data 数据方式,并尝试创建一个可以使用 mock 数据 FetchRequest。...我也做了不少尝试,但最终发现似乎 FetchRequest 仍是当前 SwiftUI最优解。...FetchRequest 获取 )由于 TCA Reducer 无法与视图存续期自动绑定,上面的可感知延迟在每次触发 onAppear 都将出现最终,我决定放下心结,仍然采用在视图中使用类似...DynamicProperty 协议为数据提供了访问 SwiftUI 托管数据池能力。通过未公开 _makeProperty 方法,数据可以在 SwiftUI 数据池中申请空间进行保存并读取。...如此一来,在将视图提取到一个单独 Package ,仍需导入包含具体 Core Data 托管对象定义库,无法做到完全解耦。

    4.6K30

    iOS学习——获取iOS设备各种信息

    1.2 UIDevice中对状态信息监控   UIDevice中对设备方向、电池状态、电量以及距离传感器等信息都能进行获取,有时候我们需要对相应状态进行监控,以便在状态发生改变我们采取相应措施...//设备方向改变发送通知 UIKIT_EXTERN NSString *const UIDeviceOrientationDidChangeNotification; //电池状态改变发送通知...UIKIT_EXTERN NSString *const UIDeviceBatteryStateDidChangeNotification NS_AVAILABLE_IOS(3_0); //电量改变发送通知...UIKIT_EXTERN NSString *const UIDeviceProximityStateDidChangeNotification NS_AVAILABLE_IOS(3_0); 其中,设备方向枚举选项有以下几种...,这是用方法控制 [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications]; //不需要可以关闭设备方向监控

    3.3K70
    领券