ObjectiveUI:使用Objective-C实现类似SwiftUI的界面开发框架

(转载请注明出处:https:///post/7078934919874871327)

介绍

一个玩具,运用Objective-C完成相似SwiftUI的界面开发结构。

运用阐明

语法和命名根本遵从SwiftUI,能够完全运用结构的接口创立简单运用。

1、创立运用进口点

去掉原有oc工程中的main函数,并在自己的App代理对象中完成OCAppProtocol协议即可(有且只有一个)。例如:

@interface DemoApp : NSObject <OCAppProtocol>
@end
@implementation DemoApp
- (OCScene *)body {
    return
    OCWindowGroup(^{
        DemoView();
    }).onChange(^(OCScenePhase scenePhase, OCScenePhase newScenePhase) {
        switch(newScenePhase) {
            case OCScenePhaseBackground:
                break;
            case OCScenePhaseActive:
                break;
            case OCScenePhaseInactive:
                break;
        }
    });
}
@end

也能够创立单独的界面,通过OCHostingController办法与原有的oc工程桥接:

OCHostingController(view, ^(UIViewController *vc) {
    // ...
});

2、视图元素的运用

与SwiftUI根本保持一致。继承OCView类并完成body办法,例如:

- (OCView *)body {
    return
    TabView(^{
        NavigationView(^{
            ScrollView(^{
                Image(@"logo")
                    .resizable(UIEdgeInsetsZero, UIImageResizingModeTile)
                    .aspectRatio(UIViewContentModeScaleAspectFit)
                    .frame(200, 50, OCAlignmentCenter);
                HStack(^{
                    Text(@"文本");
                    Button(@"按钮", nil);
                    TextField(@"输入框", $(self->_text), nil, nil);
                    TextEditor($(self->_text));
                });
                WebView([NSURL URLWithString:@"https://www.baidu.com/"])
                    .frame(300, 210, OCAlignmentCenter);
                for (int i = 0; i < 50; i++) {
                    HStack(^{
                        Text(@(i).stringValue);
                        Spacer();
                    });
                }
            }).tabItem(^{
                Image(@"circle.fill");
                Text(@"布局演示");
            }).navigationBarTitle1(@"布局演示");
        });
    });
}

ObjectiveUI:使用Objective-C实现类似SwiftUI的界面开发框架

(转载请注明出处:https:///post/7078934919874871327)

3、数据绑定

现在仅完成了StateBinding。与SwiftUI的写法稍有不同,State润饰是在类成员初始化时通过State()办法完成,变量的更新需要通过StateUpdate()办法。而Binding的润饰是运用$(),例如:

- (OCView *)body {
    return
    TabView($(_selection), ^{
        NavigationView(^{
            VStack(^{
                TextField(@"在此输入文本", $(self->_text), nil, ^{
                    [UIApplication.sharedApplication.keyWindow endEditing:YES];
                }).background(OCColor.lightGrayColor);
                HStack(^{
                    Text([NSString stringWithFormat:@"文本长度:%ld", self->_text.length]);
                    Button(@"清除", ^{
                        StateUpdate(self->_text, nil);
                    });
                });
                NavigationLink(SubViewMake($(self->_isActive2)), $(self->_isActive2), ^{
                    Text(@"二级页面");
                });
            }).tabItem(^{
                Image(@"pentagon.fill");
                Text(@"数据绑定");
            });
        }).navigationBarTitle1(@"数据绑定");
    });
}

ObjectiveUI:使用Objective-C实现类似SwiftUI的界面开发框架

阐明

这个结构仅仅一个玩具,性能自然不及SwiftUI,不主张用在实际出产环境中。别的考虑到开源项目不免会被人使用并商业化,因此暂不考虑开源。

(转载请注明出处:https:///post/7078934919874871327)