我正在构建一个非原生声音格式的音频播放器.应用程序的层次结构基于iPod.app.它有许多UITableView's和one UIView(TrackView),用于MPVolumeView允许用户在屏幕上更改音量.在第一次TrackView显示之前,使用硬件按钮更改音量会按预期(和所需)显示系统音量叠加.当TrackView可见MPVolumeView时,自从使用硬件按钮(也需要)更改音量时更新后,这些叠加不会出现.
问题在于:一旦退出TrackView系统,使用硬件音量按钮时就不会出现音量叠加.我曾尝试编程allocing,创建和加入MPVolumeView的TrackViewController viewWillAppear:,然后删除,释放和零-ING相同MPVolumeView的TrackViewController 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) 我写了一个简单的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).
编辑看起来我不懂调试器信息.即使有效的数组显示 …
我的应用程序的主窗口包含一个基于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状态?
前段时间我写了一个名为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)
启动应用程序,单击菜单项,然后单击日历.然后单击另一个应用程序,然后再次单击菜单项.日历不再响应点击次数.
我正在使用Game Kit将两个玩家添加到游戏中.我的测试设备是运行4.3.5的第三代iPod touch和运行4.2.1的第二代iPod touch.两个设备上都启用了游戏中心通知.我没有使用iPhone模拟器.这两个设备都使用单独的帐户登录到Game Center Sandbox.帐户已经是朋友了.
我可以成功验证localPlayer并启动邀请,但受邀请的设备永远不会收到邀请,并且inviteHandler永远不会调用受邀请的游戏.在inviteHandler被认证后立即设置localPlayer.我已经浏览了游戏套件编程指南并实现了GKMatchmakerViewControllerDelegate协议中的所有方法,但我很难过.
更新我修复了代码以消除重写方法的重复,并通过实施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) 在一些未注释的Objective-C代码中遇到了这个条件:
if (w & (w - 1))
{
i = 1;
while (i < w)
{
i *= 2;
}
w = i;
}
Run Code Online (Sandbox Code Playgroud)
哪里w是size_t大于1.
更新:添加条件for context包含的代码.
看一下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?
第三方库生成任意大小的16位带符号立体声样本的顺序缓冲区.我无法弄清楚要从这些缓冲区中使用哪些框架/函数.我一直在使用这个答案的例子,AudioQueue但它显然是不完整的,我无法解决(局部变量被用作对象成员,未声明的变量等).
Apple的SpeakHere示例项目中的代码仅显示如何使用AudioQueue播放文件中的音频.有人能指出我正确的方向吗?
这是一个奇怪的.我有一个以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中查找仅显示调用,接口定义和实现.我很难过(不是很需要).有没有办法解决这个问题,而没有修改我现有的命名约定?
objective-c ×6
ios ×4
iphone ×3
swift ×2
c ×1
cocoa ×1
core-data ×1
gamekit ×1
macos ×1
media-player ×1
nsdatepicker ×1
nsstatusitem ×1
oop ×1
random ×1
reflection ×1
xcode ×1