小编Mir*_*iro的帖子

如何创建 Swift 导入子模块

目前,我们已经使用多个目标对 Swift 项目进行了模块化。目标编译为 .framework 文件,这些文件是更高目标的依赖项。我们有一个 Common 模块目标、一些 Product 模块目标和原始 App 目标。Common 将包含非常低级的代码、共享库以及可能由多个产品目标共享的任何特定代码。

所以应用程序会做:

 import Common
 import Product1
 import Product2
Run Code Online (Sandbox Code Playgroud)

而 Product1 目标代码可能会这样做:

 import Common
Run Code Online (Sandbox Code Playgroud)

通常流程是 Common -> Product* -> App,其中 Common 永远不会引用另一个方向。

不幸的是 Common 已经变大了,并且有很多代码可能不是每次导入都需要的。

我希望能够在 Swift 中实现的是这样的:

import Common.API
import Common.PurchaseCheckout
Run Code Online (Sandbox Code Playgroud)

我研究了模块映射,它允许设置导入子模块,但它都集中在 Objective-c 头文件上,而不是 Swift。有快速变化吗?

具体的需求是我们想创建一个轻量级的SDK,只使用部分功能,一旦我们“导入Common”,它就会使SDK膨胀,并且还增加了对很多不相关的cocoa-pods的依赖. 我们可以在 SDK 目标文件中逐个文件地包含文件,但希望模块化能让事情变得更简单。

编辑

看来我可以使用以下内容:

import class Common.FileDownloadAPI
import class Common.FileUploadAPI
Run Code Online (Sandbox Code Playgroud)

可能在我的代码中创建部分导入的印象。然而,modulemaps 似乎是objective-c 中的一种方式来为你做这件事,创建子模块。我不想编写 100 个类导入来导入子模块可能在一次导入中执行的 200 个文件中的一半。所以还在寻找思路。

module target ios swift module-map

6
推荐指数
0
解决办法
1069
查看次数

ios延迟位置更新无法推迟

我正在研究为iOS活动跟踪器使用延迟位置更新,它允许在后台使用位置服务.我已经实现了建议的代码片段(见下文).在Xcode调试中,延迟位置尝试启动几次,直到位置数据以每秒大约1次进入.之后,它声称成功启动延迟,并且在指定的时间段到期后,完成触发器的回调也会成功.但是在此期间,位置处理程序仍然每秒运行一次.我已经读到这是因为手机还没有准备好进入后台,而Xcode中的测试就是这样做的.注意,关闭屏幕后立即调用AppDelegate的"didEnterBackground"事件处理程序,并在重新打开应用程序时重新启动.

我运行相同的代码,手机断开连接作为另一个测试,靠近窗户的GPS,屏幕关闭,或切换到完全不同的应用程序,它仍然从来没有真正推迟更新.我可以告诉,因为网络更新仍然每30秒进入一次,而不是下面的代码示例中所需的120秒的间隔.

还有什么需要实际让延期工作,因为启动它们没有错误,他们确实得到他们的完成回调?为什么即使应用程序进入后台,位置更新仍以每秒1次的速度继续?

Iphone 5s,IOS 7.1.1

// .h file (partial)
@interface MotionTracker : NSObject<CLLocationManagerDelegate, UIAccelerometerDelegate> 

@property (strong, nonatomic) CLLocationManager *locationManager;

@end

// .m file (parial)
- (id) init {
    if(self = [super init]){
        _locationManager = [[CLLocationManager alloc] init];
        _locationManager.delegate = self;
        _locationManager.distanceFilter = kCLDistanceFilterNone; 
        _locationManager.desiredAccuracy = kCLLocationAccuracyBest;

        // if set to YES (default), app stops logging location at some point and doesn't resume in any timely fashion, all data points lost in between
        _locationManager.pausesLocationUpdatesAutomatically = NO;

        _locationManager.activityType = CLActivityTypeFitness; 
    } …
Run Code Online (Sandbox Code Playgroud)

location core-location ios deferred

5
推荐指数
2
解决办法
4959
查看次数

当用户拒绝推送授权时,ios静默推送通知

我刚刚启动了一个带有IOS静默推送通知的项目,允许应用程序在后台更新.到目前为止我不清楚的一个基本点是,如果用户完全拒绝推送消息,会发生什么?这会拒绝应用程序收到静默推送通知,还是仅导致设备不能以视觉/听觉方式向用户显示消息?

我意识到苹果有规则,如果允许推送应用程序不仅应该工作,但我很好奇如何最好地处理这种情况.

push-notification ios

5
推荐指数
1
解决办法
2458
查看次数

键盘打开后视图更改后出现带有白色文本的ios黑色键盘

我正在为我的标准TextField使用"黑暗"式键盘.这是用于登录文本字段,或"忘记我的密码"文本字段,用户在其中输入一些信息,提交它,如果成功,则将它们发送到另一个视图,通常由标准导航控制器popViewControllerAanimated:.AlertView可能出现在两者之间.

我看到很多问题是键盘是打开的,正常的"深色"灰色,然后用户点击提交,可能会出现一个警报视图,当解雇时,视图转移到下一个屏幕以前的键盘关闭屏幕.在新屏幕上,另一个默认样式键盘可能会或可能不会向上滑动然后消失(甚至没有文本域聚焦!).然后,当点击另一个文本字段,或返回上一个视图并单击文本字段时,这个带有白键的黑色键盘会出现错误.它会继续出现在文本字段中,直到某些内容能够在几次单击后将其恢复为正常的深灰色.

我试图在popViewController发生之前以各种方式解除原始键盘,但它似乎没有帮助.如果AlertView出现在中间,我在单击AlertView按钮时将popViewController绑定到委托操作.键盘通常不会快速消失,在推动前离开.延迟对它没有帮助.

编辑:警报视图似乎是一个明确的罪魁祸首,以某种方式干扰弹出和键盘.

-(BOOL) textFieldShouldReturn:(UITextField *)textField{
    [textfield resignFirstResponder];
    [self.view endEditing:YES];
    return YES;
}

-(IBAction)submitRequest {
    [textfield resignFirstResponder];
    [self.view endEditing:YES];

    // make API call, if call succeeds run this block {
         UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"..."
                                                message:@"..."
                                               delegate:delegate
                                      cancelButtonTitle:@"OK"
                                      otherButtonTitles:nil, nil];
          dispatch_async(dispatch_get_main_queue(), ^{
            [alert show];
          });         
    // }
}

// delegate after alert OK is pressed
- (void) alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
  [self.navigationController popViewControllerAnimated:YES];
}
Run Code Online (Sandbox Code Playgroud)

如何避免使用黑/白键盘?

在此输入图像描述

keyboard ios alertview

5
推荐指数
1
解决办法
629
查看次数

如何将多个内部 swift 模块(框架)打包到单个第 3 方框架中?

在我们的 Xcode 项目中,我们已经开始实现 ios 模块,将我们庞大的代码库划分为独立的部分。

我们有以下模块:

Common
Product1
Product2
Product
App
Run Code Online (Sandbox Code Playgroud)

其中App使用Product1、Product2和Common,并且Product1使用Common,但Common对更高级别的项目一无所知。

在 XCode/Swift 中,它们作为单独的目标实现,并生成导入到更高级别目标中的框架。它非常适合该应用程序。最终产品应用程序编译时无需关心它来自通过依赖框架的多个目标。

我们还有一个为第三方部署的实际框架。之前,我们选择了框架中存在的所有文件,并使它们成为框架目标和应用程序目标的双重成员。

然而现在我们有了这种依赖关系,其中较低级别的模块作为“目标依赖关系”包含在 xcode 中。

ProductFramework3rdParty
Product1
Common
Run Code Online (Sandbox Code Playgroud)

ProductFramework 在模拟器中编译良好,它可以嵌入到准系统示例应用程序中并作为嵌入式二进制文件运行。这就是目标。

然而,在设备上,它给出了在运行时找不到通用框架的错误。

dyld: Library not loaded: @rpath/Common.framework/Common
Referenced from: 
/private/var/mobile/Containers/Bundle/**/**/ProductFramework3rdParty/ProductFramework3rdParty
Reason: image not found
Run Code Online (Sandbox Code Playgroud)

仅当我将 Common 模块以及最终的 Product1 模块也嵌入到 3rd 方应用程序中时,它才有效。这并不是真正的预期目标,必须向客户提供我们的官方框架以及内部模块。我们的代码中最终可能有 5-10 个模块,并且希望将其全部打包到单个分布式框架中。

我们应该怎么做?

我尝试将 Common 的 Mach-O 从动态更改为静态,但没有成功,它创建了一长串我无法克服的链接错误。以及将 Common 扩大到 100mb,比以前大得多。

frameworks module target ios swift

5
推荐指数
0
解决办法
671
查看次数

反应路由器6路由参数

我正在尝试设置一些反应路由器路由,专门使用最新的 v6。我想做的是拥有一个具有类似于休息的页面层次结构的网站,并且能够轻松解析出 ID。具体来说,路径上有两级 ID。

我在如何使用 React 路由器范例正确解析 url 中的 ID 时遇到了麻烦。我可以window.location.pathname自己使用和解析它,或者像 2003 年那样使用库,但必须有一种更具反应性的方法来做到这一点。

这是所需的基本 url 结构:

/collection/          (all collections) 
/collection/123       (collection 123)
/collection/123/abc   (collection 123, subgroup abc)
/collection/123/all   (special handler, collection 123, all subgroups)
Run Code Online (Sandbox Code Playgroud)

似乎我可以使用useParams(),但是当我console.log在屏幕中使用时,它似乎根本没有帮助或结构化。见下文。

是否应该有更好的方法来提取路线中的:id或指定的内容?:groupId无论如何,我最终仍然需要解析自己,而不只是“*”的一个属性。我希望有一个“id”和“groupId”属性,但也许我的做法是错误的。

// App.tsx
<BrowserRouter>
  <Routes>
    <Route path="/collection/*" element={<CollectionScreen />} />
  </Routes>
</BrowserRouter>
Run Code Online (Sandbox Code Playgroud)
// CollectionScreen.tsx
const params = useParams()

console.log(params);
// {*: ''}        // path:  /collection
// {*: '123'}     // path:  /collection/123
// {*: '123/abc'} // …
Run Code Online (Sandbox Code Playgroud)

reactjs react-router react-router-dom

5
推荐指数
1
解决办法
1万
查看次数

从JSON序列化中在NSUserDefaults中存储[NSNull null]值会导致不必要的异常

我有一个应用程序,我使用基于JSON的API.作为JSON的一部分,通常将值设置为"null".这可能很常见:

{"data":["one","two","three"],"name":null,otherstuff:10}
Run Code Online (Sandbox Code Playgroud)

最近我试图在NSUserDefaults中存储一个从JSON对象转换的misc NSDictionary层次结构.不幸的是,如果存在空数据,则在IOS中将其转换为[NSNull null]会导致异常.显然,无法保存在prefs中.

我想知道是否有人曾经解决过这个问题?我尝试添加一些逻辑来首先从JSON中删除所有空值,但成功有限,但在存储之前必须修改数据似乎是不合适的.有没有更好的方法来处理这个?

null json nsuserdefaults ios

4
推荐指数
2
解决办法
4329
查看次数

IOS UITableViewCells在第一个小区,Iphone5S设备中都混乱,64位模拟器

我有一个表现奇怪的UITableView.具体来说,它在cellForRowAtIndexPath中生成了一个常数8个单元格,带有一些基本文本和图像.在模拟器中它很棒.在我的Iphone5上,它的工作方式与模拟器完全相同,但是在我的Iphone5s上,单元格在第一个单元格应该存在的地方互相混淆.下面的图像分别显示5s和模拟器/ 5.左侧"退出应用程序"按钮应存在于最后一个单元格中,并且正在添加到其他内容之上,也由箭头指示.

编辑:第三个图像是64位模拟器,更新的cellForRowAtIndexPath是超简化的,只需将textLabel设置为所有8行的"Hello".

Autolayout未在应用程序的任何位置使用.

Iphone 5S正在运行IOS7.1.1,但Iphone5正在运行IOS7.1.模拟器是最新Xcode(5.1.1)的一部分,最新的7.1.我无法想象5s的最新.1可能会导致这种情况.

有什么想法为什么这是混乱的,具体为什么只有在5S?

iPhone 5S iphone5或模拟器 64位

- (NSInteger)numberOfSectionsInTableView:(UITableView*)tableView {
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return 8;
}

- (float)tableView:(UITableView*)tableView heightForRowAtIndexPath:(NSIndexPath*)indexPath {
    float height =  self.view.frame.size.height / [self tableView:tableView numberOfRowsInSection:indexPath.section];
    return height;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    NSString *CellIdentifier = @"CellMain";

    UITableViewCell *_cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (_cell == nil) {
        _cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
         _cell.selectionStyle = UITableViewCellSelectionStyleNone;
    }

    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
    NSString *user_fullname = [userDefaults valueForKey:@"user_fullname"];

    _cell.textLabel.textColor = [UIColor …
Run Code Online (Sandbox Code Playgroud)

uitableview ios

3
推荐指数
1
解决办法
1110
查看次数

忽略xcode 5编译中的ios8代码

我有一个团队正在研究一些IOS代码.一位开发人员(我)拥有Xcode6-beta和几行IOS8特定代码.当另一个Xcode5的开发人员为IOS7构建它时,编译失败,因为他不存在IOS8 SDK.

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0){
    // ios8 code
} else {
    // ios7 and less way
}
Run Code Online (Sandbox Code Playgroud)

有没有办法忽略基于SDK或Xcode版本的Xcode编译中的IOS8代码,以便编译?

xcode conditional-compilation

3
推荐指数
1
解决办法
1070
查看次数

Watchkit动画实现:钟面,动画图表,循环进度条

我已经看到了一些非常基本的潜在watchkit应用程序演示,有些似乎实现了动画.例子可能是:

  • 一个带有移动秒针甚至分针的钟面.
  • 带有条形图的条形图,其中有动画,或者形状随新的实时数据而变化.
  • 圆形进度条,其条形图从零动画到当前值.

到目前为止,我看到的唯一一种做动画的方法是在一段时间内拍摄一系列图像:

[imageView startAnimatingWithImagesInRange:NSMakeRange(0, 60) duration:1.0 repeatCount:0];
Run Code Online (Sandbox Code Playgroud)

这些先前的动画示例通常如何实现?我无法想象他们都完成了图像序列.我认为甚至不能分层图像,协调放置将是一场噩梦.

iphone animation ios watchkit

3
推荐指数
1
解决办法
2944
查看次数