小编Sha*_*man的帖子

使用MPVolumeView后,如何重新打开系统卷覆盖?

我正在构建一个非原生声音格式的音频播放器.应用程序的层次结构基于iPod.app.它有许多UITableView's和one UIView(TrackView),用于MPVolumeView允许用户在屏幕上更改音量.在第一次TrackView显示之前,使用硬件按钮更改音量会按预期(和所需)显示系统音量叠加.当TrackView可见MPVolumeView时,自从使用硬件按钮(也需要)更改音量时更新后,这些叠加不会出现.

问题在于:一旦退出TrackView系统,使用硬件音量按钮时就不会出现音量叠加.我曾尝试编程allocing,创建和加入MPVolumeViewTrackViewController viewWillAppear:,然后删除,释放和零-ING相同MPVolumeViewTrackViewController viewWillDisappear:.

这在iPod.app中不会发生.MPVolumeView使用硬件音量按钮时,退出包含系统卷覆盖显示的视图后.

我错过了什么?


更新2:这似乎是MPVolumeView中的一个错误,它在iOS 3.2之后的某个时候引入并在4.2中修复.


更新:我从基于窗口的默认应用程序项目中进行了简单的缩减,该项目表现出相同的行为.一旦MPVolumeView变得可见,系统卷覆盖将再次在应用程序中看不到.

VolumeAppDelegate.h:

#import <UIKit/UIKit.h>
#import <MediaPlayer/MediaPlayer.h>

@interface VolumeAppDelegate : NSObject <UIApplicationDelegate> {
    UIWindow *window;
    IBOutlet UIView *volumeView;
    IBOutlet MPVolumeView *mpVolumeView;
}

@property (nonatomic, retain) IBOutlet UIWindow *window;

-(IBAction)toggleVolumeView:(id)sender;

@end
Run Code Online (Sandbox Code Playgroud)

VolumeAppDelegate.m:

#import "VolumeAppDelegate.h"

@implementation VolumeAppDelegate

@synthesize window;

-(IBAction)toggleVolumeView:(id)sender{

    if (mpVolumeView == nil){
        mpVolumeView = [[MPVolumeView …
Run Code Online (Sandbox Code Playgroud)

iphone media-player ios

54
推荐指数
1
解决办法
2965
查看次数

将arc4random()的结果转换为Int时崩溃

我写了一个简单的Bag类.袋子装有固定比例的温度枚举.它允许您随机抓取一个并在空时自动重新填充.它看起来像这样:

class Bag {
    var items = Temperature[]()

    init () {
        refill()
    }

    func grab()-> Temperature {
        if items.isEmpty {
            refill()
        }

        var i = Int(arc4random()) % items.count
        return items.removeAtIndex(i)
    }

    func refill() {
        items.append(.Normal)

        items.append(.Hot)
        items.append(.Hot)

        items.append(.Cold)
        items.append(.Cold)
    }
}
Run Code Online (Sandbox Code Playgroud)

温度枚举如下所示:

enum Temperature: Int {
    case Normal, Hot, Cold
}
Run Code Online (Sandbox Code Playgroud)

GameScene:SKScene有一个常量实例属性bag:Bag.(我用一个变量试为好.)当我需要一个新的温度我打电话bag.grab()的,一旦didMoveToView当适当touchesEnded.

随机此调用崩溃的if items.isEmpty一致Bag.grab().错误是EXC_BAD_INSTRUCTION.检查调试器显示项目是size=1[0] = (AppName.Temperature) <invalid> (0x10).

编辑看起来我不懂调试器信息.即使有效的数组显示 …

random swift

27
推荐指数
1
解决办法
7463
查看次数

确定是否以模态方式呈现UIViewController

我的应用程序的主窗口包含一个基于xib的UITabBarController(在Interface Builder中完全配置),也可以模态呈现(很像Music.app"将歌曲添加到播放列表"模态视图).该的UITabBarController包含许多又包含子类UITableViewControllers UINavigationControllers的.这就是我,如果子类的UITableViewController正在呈现模态的UITabBarController内我目前正在检测:

- (void)viewDidLoad {
    [super viewDidLoad];

    self.isModal = NO;

    UIViewController *child     = self;
    UIViewController *parent    = self.parentViewController;
    while (parent) {
        if (parent.modalViewController && parent.modalViewController == child) {
            self.isModal = YES;
            break;
        }
        child   = parent;
        parent  = parent.parentViewController;
    }

    if (self.isModal) {
        // modal additions, eg. Done button, navigationItem.prompt
    }
    else {
        // normal additions, eg. Now Playing button
    }
}
Run Code Online (Sandbox Code Playgroud)

有没有办法做到这一点,不涉及走向parentViewController树或子类化所有中间视图控制器,以在初始化时传递isModal状态?

objective-c ios

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

NSStatusBar中的NSDatePicker NSSMenuItem未接收输入

前段时间我写了一个名为Day-O的简单日历菜单栏小部件.日历使用嵌套在NSMenuItem中的NSView内部的NSDatePicker库存添加到NSStatusItem中的NSMenu中.该应用程序有一个activationPolicy .accessory(最初通过plist的"Application is agent"bool设置).在某些时候(可能是El Capitan更新?)日历停止响应输入.当应用程序首次启动时,您可以单击状态栏项以展开菜单并与日历交互,并按预期响应用户输入.但是一旦应用程序失去了初始焦点,日历就会停止响应输入.

我认为我已经跟踪了问题,直到最初辞职活动后应用程序未激活.问题是,如果我在单击菜单栏项目时尝试手动激活应用程序(使用NSApp.activate(ignoringOtherApps:true)),则菜单(您刚刚打开)将被解除.

我也试过告诉窗口让NSDatePicker成为第一个响应者,但这似乎也没有任何效果.

当状态栏应用程序不是活动应用程序时,如何在菜单项中获取NSDatePicker以接受用户输入?


编辑:最简单的代码来说明问题(在新的macOS Cocoa应用程序中将其添加到AppDelegate):

let statusItem = NSStatusBar.system().statusItem(withLength:NSVariableStatusItemLength)
func applicationDidFinishLaunching(_ aNotification: Notification) {
    NSApp.setActivationPolicy(.accessory)

    statusItem.button?.title = "Calendar"

    let menu = NSMenu()
    let item = NSMenuItem()
    let picker = NSDatePicker(frame: NSRect(x: 0, y: 0, width: 140, height: 148))
    picker.datePickerStyle = .clockAndCalendarDatePickerStyle

    item.view = picker
    menu.addItem(item)

    statusItem.menu = menu
}
Run Code Online (Sandbox Code Playgroud)

启动应用程序,单击菜单项,然后单击日历.然后单击另一个应用程序,然后再次单击菜单项.日历不再响应点击次数.

macos cocoa nsstatusitem nsdatepicker swift

8
推荐指数
1
解决办法
902
查看次数

inviteHandler从未打过电话

我正在使用Game Kit将两个玩家添加到游戏中.我的测试设备是运行4.3.5的第三代iPod touch和运行4.2.1的第二代iPod touch.两个设备上都启用了游戏中心通知.我没有使用iPhone模拟器.这两个设备都使用单独的帐户登录到Game Center Sandbox.帐户已经是朋友了.

我可以成功验证localPlayer并启动邀请,但受邀请的设备永远不会收到邀请,并且inviteHandler永远不会调用受邀请的游戏.在inviteHandler被认证后立即设置localPlayer.我已经浏览了游戏套件编程指南并实现了GKMatchmakerViewControllerDelegate协议中的所有方法,但我很难过.

gamekit ios

7
推荐指数
1
解决办法
1019
查看次数

如何检查Objective-C中的类?

更新我修复了代码以消除重写方法的重复,并通过实施Mark的建议来跟踪属性或方法的创建者.还没有处理过属性类型(可能会property_getAttributes()在我做的时候开始).也删除了退化的下划线.


基本上我需要一种方法来提醒自己在给定对象上可用的方法和属性,而不必一直向下遍历继承树.

我已经完成了以下功能,但它有点不尽如人意:

#import <objc/runtime.h>

NSInteger inspectClass_alphabeticSort(id string1, id string2, void *reverse)
{
    if ((NSInteger *)reverse == NO)
    {
        return [string2 localizedCaseInsensitiveCompare:string1];
    }
    return [string1 localizedCaseInsensitiveCompare:string2];
}

void inspectClassStopAt(Class inspectedClass, Class stopClass)
{
    Class originalClass             = inspectedClass;
    NSString *originalClassString   = [NSString stringWithFormat:@"%@", originalClass];
    NSString *inheritancePath       = [NSString stringWithFormat:@"%@", originalClass];

    Method *methods;
    objc_property_t *properties;
    unsigned int i;
    unsigned int methodCount;
    unsigned int propertyCount;
    int reverseSort = NO;

    NSArray *sorted;
    NSArray *methodsAndPropertiesKeys;
    NSMutableDictionary * methodsAndProperties = [NSMutableDictionary …
Run Code Online (Sandbox Code Playgroud)

oop reflection objective-c

6
推荐指数
1
解决办法
1435
查看次数

这个条件测试什么?

在一些未注释的Objective-C代码中遇到了这个条件:

if (w & (w - 1))
{
    i = 1;
    while (i < w)
    {
        i *= 2;
    }
    w = i;
}
Run Code Online (Sandbox Code Playgroud)

哪里wsize_t大于1.

更新:添加条件for context包含的代码.

c objective-c

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

核心数据支持的UITableView中的非核心数据数据

看一下Music.app(或iPod.app).根相册视图具有"所有歌曲"行.根歌曲视图有一个"随机"行.根播放列表视图具有"添加播放列表..."行.静态数据混合在同一个UITableView中(可能是)Core Data数据.我想知道Apple是如何实现这一目标的.

我尝试了两种不同的方法,都失败了.像Music.app一样,我的视图在tableHeaderView中也有一个UISeachBar.我第一次尝试保持跟踪有多少"静态"行我有和调整提供给各种的UITableView并要求部分和行信息NSFetchedResultsController方法indexPath.在我实现NSFetchedResultsControllerDelegate方法以允许创建,编辑和删除之前,一切都运行良好.该insertRowsAtIndexPaths:withRowAnimation:方法(以及类似的)大干快上我的调整indexPaths绊倒.默认的indexPaths也不起作用.

我的第二次尝试在其中嵌套另一个UITableView中在我的主要的UITableView的tableHeaderView要用于静态行(并安置在它自己的tableHeaderView的UISeachBar).这种方法甚至没有进入可编辑的阶段.在结束的UISearchBar了由根的UITableView的sectionIndex洗涤重叠和滚动的短名单时,不会再向上滑动的UINavigationBar的后面.

因此,我不是要诊断我的具体问题,而是在寻求关于Apple如何实现这一目标的建议.它们可以是获取数据一次,在一个NSArray缓存它和构建部和行,其包括静态和核心数据行的嵌套的NSArray?

core-data objective-c ios

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

在由第三方库解码的iPhone上播放音频

第三方库生成任意大小的16位带符号立体声样本的顺序缓冲区.我无法弄清楚要从这些缓冲区中使用哪些框架/函数.我一直在使用这个答案的例子,AudioQueue但它显然是不完整的,我无法解决(局部变量被用作对象成员,未声明的变量等).

Apple的SpeakHere示例项目中的代码仅显示如何使用AudioQueue播放文件中的音频.有人能指出我正确的方向吗?

iphone objective-c

2
推荐指数
1
解决办法
1870
查看次数

'TileMap'可能无法响应'+ mapNamed:'

这是一个奇怪的.我有一个以TileMap下面的接口命名的类:

@interface TileMap : NSObject
{
    int *data;
    int tilesWide;
    int tilesHigh;
    NSString *imageName;
}

+ (id)mapNamed:(NSString *)filename;
- (id)initWithFile:(NSString *)filename;

@end
Run Code Online (Sandbox Code Playgroud)

实现如下:

@implementation TileMap

+ (id)mapNamed:(NSString *)filename
{
    return [[self alloc] initWithFile:filename];
}

- (id)initWithFile:(NSString *)filename
{
    if (self = [super init])
    {
        // ...
    }
    return self;
}


@end
Run Code Online (Sandbox Code Playgroud)

但是当我[TileMap mapNamed:@"map.plist"];向我的应用程序添加一个调用时,Xcode警告:

'TileMap'可能无法响应'+ mapNamed:'

应用程序编译正常,并记录NSLog内部调用TileMap-initWithFile:.我注意到Xcode的语法着色对于这个类和方法是关闭的,所以我尝试分别重命名类和方法.消除警告和语法着色问题的唯一组合是重命名类和方法.

我是否与一些未记录的框架类或方法发生冲突?在文档中查找不会透露任何内容.在Project中查找仅显示调用,接口定义和实现.我很难过(不是很需要).有没有办法解决这个问题,而没有修改我现有的命名约定?

iphone xcode objective-c

0
推荐指数
1
解决办法
440
查看次数